您的位置:首页 > 移动开发 > IOS开发

iOS之AFNetWorking

2016-08-13 21:10 253 查看
上一篇大致了解了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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios