玉玊 發表於 2020-6-25 11:39:00

iOS开发--AFN框架基本使用

<h1 id="ios开发--afn框架基本使用">iOS开发--AFN框架基本使用</h1>
<h2 id="技术概述">技术概述</h2>
<p>AFNetworking是目前国内开发网络应用使用最多的第三方框架,专为 Mac OS &amp; 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---&gt;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&lt;AFMultipartFormData&gt;_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]
查看完整版本: iOS开发--AFN框架基本使用