AFN之使用问题解析

一、背景介绍

对于移动端编程来讲,网络请求数据是最主要需要实现的功能了,如果移动端少了数据展示,也就缺少了很多的内容。
那么一旦要实现某个重大的功能,我们首先第一位的是看看原生怎么实现的,但是呢我们今天主要带大家看看第三方开源框架AFN在使用过程中所出现的问题。

二、基础代码

话不多说,先上基础代码,然后再一点点看出现的问题,并且解决问题

//先用将第三方框架导入进来,可以手动导入也可以通过pod加入,本处我采用手工导入
#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self afnRequestData1];
}

- (void)afnRequestData1{
    NSString *urlString = @"http://baike.baidu.com/link?url=1McXFsRxWd2wVxenuZHAX_0Kn4_RAiPpv7jTp4_utVx-pY5MQJ_jCrakyuLKuf2s8G8rwZgjGJ6T_lWuumGDIncSv-GVSiHPrZH5YwA2sJi";
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%s", __FUNCTION__);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

@end

三、问题分析和解决

1>首先运行刚刚贴上的基础代码,发现报如下错误

Snip20170429_2.png

报出此错误的原因是因为我们没加ATS,加ATS的方式有两种
第一种:

Snip20170429_5.png

第二种:

Snip20170429_8.png

第二种的源码如下:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2>添加ATS后,再次运行发现这个响应错误码-1016,如图:

Snip20170429_9.png

这个的意思是AFN不支持响应的内容为网页内容格式text/html,
那么需要添加一个字段的内容格式,代码如下:

//注意原有的三种格式也要加上
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

3>加上内容格式之后再次运行,报错如下:

Snip20170429_10.png

错误意思:AFN默认是把接收到的数据当做Json来处理的,所以发现接收到的数据并不是以字典和数组作为顶级节点的Json格式数据,所以报错
问题原因:AFN默认解析的数据是Json,所以需要修改AFN对响应内容的处理方式(是按照json来处理呢,还是按照其他的来处理)
代码如下:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

4>到此就能够收到返回的数据了,当然可能我们收到的是一张图片呢,那图片的内容格式又是如何呢?我们接下来测试一下,我上百度图片里扒一张照片,链接代码如下:

NSString *urlString = @"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3495161387,2602242859&fm=23&gp=0.jpg";

报错如下:

Snip20170429_12.png

添加内容格式:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",@"image/jpeg", nil];

到此我所要说的问题就说完了,如果大家有遇到其他的AFN报错问题,欢迎致电我的邮箱:1218424215@qq.com

Demo后期奉上,写的不好和有问题的地方希望大家积极指正,或者可以补全的地方可在下方评论

我是淘气的七禾,以上!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,386评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,327评论 25 709
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 10,049评论 0 12
  • 01 当我走进办公室时,突然发现同事都在看我,我赶紧上下检查一下自己的穿着,没发现什么问题啊。我坐到自己的办公桌前...
    韩风奔跑阅读 4,803评论 38 23
  • 以终为始:目标+原则+计划。 不忘初心方得始终。加油! Good night!
    FineYoga思媛阅读 1,313评论 0 0