iOS开发--AFN框架基本使用
<h1 id="ios开发--afn框架基本使用">iOS开发--AFN框架基本使用</h1><h2 id="技术概述">技术概述</h2>
<p>AFNetworking是目前国内开发网络应用使用最多的第三方框架,专为 Mac OS & iOS 设计的一套网络框架,对 NSURLConnection 和 NSURLSession 做了封装,提供有丰富的 API,同时提供了完善的错误解决方案,使用简单。</p>
<h2 id="技术详述">技术详述</h2>
<h3 id="使用案例">使用案例</h3>
<p>我在此次团队开发项目中使用AFNetworking请求后端接口,给后端发送数据,图片文件。<br>
例如访问新增日记的接口:<br>
<img src="https://upload-images.jianshu.io/upload_images/16426082-e4f33f1fb4755adc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="图1" loading="lazy"><br>
<img src="https://upload-images.jianshu.io/upload_images/16426082-cf04da8ad5e00eb4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="图2" loading="lazy"></p>
<h3 id="步骤">步骤</h3>
<p>1.创建会话管理者manager<br><br>
2.发送POST/GET请求<br><br>
第一个参数:请求路径(不包含参数).NSString<br><br>
第二个参数:字典(发送给服务器的数据~参数)<br><br>
第三个参数:constructingBodyWithBlock 处理要上传的文件数据<br><br>
第四个参数:progress 进度回调<br><br>
第五个参数:success 成功回调<br><br>
responseObject:响应体信息(JSON--->OC对象)<br><br>
第六个参数:failure 失败回调<br><br>
error:错误信息<br></p>
<h3 id="数据格式">数据格式</h3>
<ul>
<li>请求数据格式:AFURLRequestSerialization</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: center">类型</th>
<th style="text-align: center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">AFHTTPRequestSerializer</td>
<td style="text-align: center">二进制的,默认的</td>
</tr>
<tr>
<td style="text-align: center">AFJSONRequestSerializer</td>
<td style="text-align: center">JSON(POST JSON) RESTful 设计风格需要</td>
</tr>
<tr>
<td style="text-align: center">AFPropertyListRequestSerializer</td>
<td style="text-align: center">PList(POST Plist-开发中几乎不用)</td>
</tr>
</tbody>
</table>
<ul>
<li>响应数据格式:AFURLResponseSerialization</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: center">类型</th>
<th style="text-align: center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">AFHTTPResponseSerializer</td>
<td style="text-align: center">HTTP 二进制的</td>
</tr>
<tr>
<td style="text-align: center">AFJSONResponseSerializer</td>
<td style="text-align: center">JSON 默认的</td>
</tr>
<tr>
<td style="text-align: center">AFXMLParserResponseSerializer</td>
<td style="text-align: center">XML Parser 解析器 SAX 解析</td>
</tr>
</tbody>
</table>
<h3 id="常见功能">常见功能</h3>
<ul>
<li>
<p>发送GET/POST请求</p>
<pre><code class="language-oc">NSDictionary *dic1=@{
@"phone":_phone, @"username":alert.textFields.text
};
AFHTTPSessionManager *manager1=;
manager1.requestSerializer = ;
manager1.responseSerializer = ;
[manager1 POST:@"http://localhost:8080/OneDay/user/username" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
NSLog(@"%@",responseObject);
[ setObject:alert.textFields.text forKey:@"username"];
_username=alert.textFields.text;
[ synchronize];
;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSError *err=error;
NSLog(@"%@",err);
UIAlertController *alert=;
];
;
}];
</code></pre>
</li>
<li>
<p>下载/上传文件<br>
上传图片:</p>
</li>
</ul>
<pre><code class="language-oc"> AFHTTPSessionManager *manager=;
manager.requestSerializer = ;
manager.responseSerializer = ;
[manager POST:@"http://localhost:8080/OneDay/user/profilePhoto" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>_Nonnull formData)
{
NSData *data1=;
;
NSData *data=UIImageJPEGRepresentation(image, 0.7);
NSDateFormatter *formatter = [ init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = ];
NSString *fileName = ;
//上传文件参数
;
} progress:^(NSProgress * _Nonnull uploadProgress) {
//打印上传进度
CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
NSLog(@"%.2lf%%", progress);
} success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
//成功之后修改phone
NSDictionary *dic1=@{
@"phone":_phone,
@"password":_password,
};
AFHTTPSessionManager *manager1=;
manager1.requestSerializer = ;
manager1.responseSerializer = ;
[manager1 POST:@"http://localhost:8080/OneDay/user/login" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
NSDictionary *nsdic=responseObject;
NSLog(@"%@",nsdic);
[ setObject: forKey:@"photo"];
[ synchronize];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSError *err=error;
NSLog(@"%@",err);
}];
NSLog(@"请求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//请求失败
NSLog(@"请求失败:%@",error);
}];
</code></pre>
<h3 id="附加功能">附加功能</h3>
<ul>
<li>安全策略
<ul>
<li>HTTPS</li>
<li>AFSecurityPolicy</li>
</ul>
</li>
<li>网络检测
<ul>
<li>对苹果的网络连接检测做了一个封装</li>
<li>AFNetworkReachabilityManager</li>
</ul>
</li>
</ul>
<pre><code class="language-oc"> //创建一个单例manager
AFNetworkReachabilityManager *manager = ;
//监测网络状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"连接到路由器网络不能到达");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//开启检测
;
</code></pre>
<h3 id="技术使用中遇到的问题">技术使用中遇到的问题</h3>
<ul>
<li>3840报错<br>
<img src="https://upload-images.jianshu.io/upload_images/16426082-d11c95ea6075c623.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="图3" loading="lazy"></li>
<li>1016报错<br>
在进行网络请求时出现-1016 是因为只支持text/json,application/json,text/javascript你可以添加text/html或其他</li>
</ul>
<pre><code>manager.responseSerializer.acceptableContentTypes = ;
</code></pre>
<h3 id="总结">总结</h3>
<p>AFNetworking是iOS开发中常使用的框架,一个构建在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架,主要使用在发送网络请求以及实时监测网络状态的两个场景中,对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使用起来非常轻松,post和get请求管理类定义api完全相同。</p>
<p>参考博客1<br><br>
参考博客2</p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:sw</div>
<p>-------------------------------------------</p>
<p>起风了,唯有努力生存</p><br><br>
来源:https://www.cnblogs.com/aurorasw/p/13191405.html
頁:
[1]