iOS之AFNetWorking

上一篇大致了解了AFNetworking。网络请求主要的核心就是建立连接传送自己的参数发送请求,然后得到返回结果,对数据进行解析。这里大致说一下AFNetworking的AFURLRequestserialization。

构建请求
1)格式化参数
用户参数(NSArray,NSDictionary,NSSet等)转化为AFNetworking要求的数据,每一个key-value对都用一个对象AFQueryStringPair表示,作用是最后可以根据不同的字符串编码生成各自的key=value字符串。最后生成NSURLRequest可用的字符串数据,并且对参数进行url编码,用的函数是AFQueryStringFromParamtersWithEncoding。

2)构建httpHeader
AFNetworking帮你组装好了一些HTTP请求头,包括语言Accept-Language,根据 [NSLocale preferredLanguages] 方法读取本地语言,高速服务端自己能接受的语言。还有构建 User-Agent,以及提供Basic Auth 认证接口,帮你把用户名密码做 base64 编码后放入 HTTP 请求头。如下例子:

NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@",BASEURL]];

    NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
    [params setObject:@"123a@qq.com" forKey:@"email"];
    [params setObject:@"123456" forKey:@"password"];
    [params setObject:api_key forKey:@"api_key"];
    [params setObject:group_id forKey:@"group_guid"];
    [params setObject:RadioID forKey:@"radioID"];

    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];

    [client registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [client setDefaultHeader:@"Accept" value:@"text/html"];

3)其他格式参数处理
HTTP请求参数不一定是要key=value形式,可以是任何形式的数据,可以是json格式,苹果的plist格式,二进制protobuf格式等,AFNetworking提供了方法可以很容易扩展支持这些格式,默认就实现了json和plist格式。AFJSONRequestSerializer和AFPropertyListRequestSerializer就是来处理这些类型的数据。

构建multipart请求

为什么要构建这个请求呢?什么是multipart呢?熟悉http协议,做过这方面开发的人一定都知道吧。Multipart是HTTP协议为web表单新增的上传文件的协议,它基于HTTP的POST方法,数据同样是放在body上,跟普通POST方法的区别是数据不是key=value形式,key=value形式难以表示文件实体,为此Multipart协议添加了分隔符,有自己的格式结构。

AFNetworking是如何实现构建这个请求呢?

AFNetworking采用的是:边上传边拼数据,上传是分片的,拼数据也是分片的,拼到文件实体部分时直接从原来的文件分片读取。这方法没上述两种的问题,只是实现起来也没上述两种简单,AFNetworking除了文件,还可以添加多个其他不同类型的数据,包括NSData,和InputStream。

这里写图片描述

通过constructingBodyWithBlock向使用者提供了一个AFStreamingMultipartFormData对象,调这个对象的几种append方法就可以添加不同类型的数据,包括FileURL/NSData/NSInputStream,AFStreamingMultipartFormData内部把这些append的数据转成不同类型的 AFHTTPBodyPart,添加到自定义的 AFMultipartBodyStream 里。最后把 AFMultipartBodyStream 赋给原来 NSMutableURLRequest的bodyStream。NSURLConnection 发送请求时会读取这个 bodyStream,在读取数据时会调用这个 bodyStream 的 -read:maxLength: 方法,AFMultipartBodyStream 重写了这个方法,不断读取之前 append进来的 AFHTTPBodyPart 数据直到读完。

AFMultipartBodyStream封装了整个multipart数据的读取,主要是根据读取的位置确定现在要读哪一个AFHTTPBodyPart。AFStreamingMultipartFormData对外提供友好的append接口,并把构造好的AFMultipartBodyStream赋回给NSMutableURLRequest。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值