此次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization。
数组
AFURLRequestSerialization类遵照`AFURLRequestSerialization`和`AFURLResponseSerialization`协议,提供一个查询字符串/表单编码的参数序列化和默认请求头的具体的基本的实现,以及响应状态代码和内容类型验证。也就是对发出的请求进行一些处理。缓存
处理HTTP的任何请求或响应序列化被鼓励纳入“AFHTTPRequestSerializer”的子类,以确保一致的缺省行为。cookie
下面仍是先看一下.h文件,看一下相关属性网络
第一个表示编码类型,字符串编码用于序列化的参数,默认值是UTF8编码
第二个bool类型表示是否建立请求可使用设备的移动无线(若是阻止的话)。默认是YES,set方法是setAllowsCellularAccessurl
第三个表示缓存策略,建立请求的缓存策略,默认是NSURLRequestUseProtocolCachePolicyspa
第一个是否建立的请求应该使用默认的cookie处理,默认是YES操作系统
第二个是否建立的请求在接收一个来自一个更近的传输源的响应以前能够继续传输数据,默认是不能够NO3d
第三个为建立的请求的网络服务类型,默认是NSURLNetworkServiceTypeDefault代理
第四个为超时时间间隔,以秒为建立请求。默认超时时间间隔是60秒。
缺省HTTP报头字段值用于序列化的请求。默认状况下,这些包括如下:——“接收语言”带有NSLocale”+ preferredLanguages '的内容——“用户代理”带有各类包标识符和操做系统的名称的内容
下面看一下实现文件
AFPercentEscapedStringFromString
方法将string里面的:#[]@!$&’()*+,;=字符替换成%
从可用字符替换删除掉:#[]@!$&’()*+,;=这些字符,声明批量处理的大小为50,循环将string里面的这些字符替换成%
往下看能够发现
在AFQueryStringPair
类里面有个- URLEncodedStringValue
方法,
在这个方法里,将请求里面的URL参数转成field=value形式。
参数字典里面是咱们查询的key和value,咱们经过将字典内容转成AFQueryStringPair
对象,调用- URLEncodedStringValue
方法,转成key=value,放到mutablePairs数组里,最后用&符拼接起来。
若是是字典,遍历后返回key[nestedKey]=nestedValue;
若是是数组,遍历后返回key[nestedKey]=nestedValue;
若是是集合,遍历后返回key=obj;
若是是其余的,返回key=value.
根据上述分析
假设传入key和value,我将key,value放到数组里面,再放到mutableQueryStringComponents里
NSSet *afSet = [NSSet setWithObjects:@(1),@(2), nil];
NSDictionary *afDic = @{@"dickey": @{@"nestKey": @"nestValue"},
@"arrayKey": @[@[@(1)]],
@"setKey": afSet,
@"generalKey": @"generalValue"};
NSArray *resultArray = AFQueryStringPairsFromKeyAndValue(nil, afDic);
打印获得的结果是
[[arrayKey, 1],
[dickey[nestKey],nestValue],
[generalKey, generalValue],
[setKey, 1],
[setKey,2]]
接下来主要看一下AFHTTPRequestSerializer初始化方法,咱们使用AFHTTPRequestSerializer
对HTTP请求的头部进行处理
首先调用+ serializer
进行初始化,里面调用了本身init方法
init里面先将Accept-Language存到mutableHTTPRequestHeaders里
将mainBundle里面根据使用语言的优先顺序放到acceptLanguagesComponents里面,再用","分隔,存到mutableHTTPRequestHeaders字典里面
而后拼接User-Agent,格式为”%@/%@ (%@; iOS %@; Scale/%0.2f)”,里面须要5个参数,第一个参数先获取项目名,若是没有,就用BundleIdentifier,第二个参数先获取短版本号,若是没有就用版本号,第三个参数是当前设备的类型,第四个参数是当前设备的版本号,第五个参数是屏幕的比例
而后设置属性的监听,这些属性在头文件里面均可以找到,实现文件里面也实现了set方法。在这里边调用了静态方法AFHTTPRequestSerializerObservedKeyPaths
下面实现了模式键值观察
经过KVO判断是不是新值,若是是的话,就加到mutableObservedChangedKeyPaths里面。
设置验证字段。
在初始化以后须要调用一下方法
根据url初始化,设置HTTP方法,根据mutableObservedChangedKeyPaths存储的属性,设置到mutableRequest当中,
调用- [requestBySerializingRequest:withParameters:error]方法,该方法以下
根据HTTPRequestHeaders来设置mutableRequest的头部字段。若是设置了queryStringSerialization这个block的话,就须要设置一个自定义的查询语句序列化方法,转成query查询参数。若是没有设置,则调用AFQueryStringFromParameters方法,转成query查询参数。将拼接好的query语句放到 mutableRequest.URL或者放到mutableRequest的HTTPBody里。
若有转载,请注明出处
参考文章:http://zeeyang.com/2016/05/25/AFNetWorking-five/