这个方法就是AFHTTPSessionManager 中构建NSMutableRequest的方法,分三步进行讲解。
第一步
1.通过URLString 构建NSURL
2.通过NSURL构建NSMutableURLRequest,并设置HTTPMethod
第二步
AFHTTPRequestSerializerObservedKeyPaths()
使用static 修饰符,表示该方法只能在本文件中使用
整体使用了单例模式,当值改变时,整体都会有所改变。
简单介绍一下各个属性的作用:
/**
是否允许使用设备的蜂窝移动网络来创建request,默认为允许:
*/
@property (nonatomic, assign) BOOL allowsCellularAccess;
/**
创建的request所使用的缓存策略,默认使用`NSURLRequestUseProtocolCachePolicy`,该策略表示
如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断
下一步操作,如: Cache-Control字段为must-revalidata, 则 询问服务端该数据是否有更新,无更新话
直接返回给用户缓存数据,若已更新,则请求服务端.
*/
@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;
/**
如果设置HTTPShouldHandleCookies为YES,就处理存储在NSHTTPCookieStore中的cookies
HTTPShouldHandleCookies表示是否应该给request设置cookie并随request一起发送出去
*/
@property (nonatomic, assign) BOOL HTTPShouldHandleCookies;
/**
HTTPShouldUsePipelining表示receiver(理解为ios客户端)的下一个信息是否必须等到上一个请求回复才能发送。
如果为YES表示可以,NO表示必须等receiver收到先前的回复才能发送下个信息。
*/
@property (nonatomic, assign) BOOL HTTPShouldUsePipelining;
/**
设定request的network service类型. 默认是`NSURLNetworkServiceTypeDefault`.
这个network service是为了告诉系统网络层这个request使用的目的
比如NSURLNetworkServiceTypeVoIP表示的就这个request是用来请求网际协议通话技术(Voice over IP)。
系统能根据提供的信息来优化网络处理,从而优化电池寿命,网络性能等等
*/
@property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType;
/**
超时机制,默认60秒
*/
@property (nonatomic, assign) NSTimeInterval timeoutInterval;
然后判断mutableObservedChangedKeyPaths是否包含以上这些keypath
mutableObservedChangedKeyPaths是一个集合,在初始化时,可以看到
循环遍历将每个属性就行KVO监听
当值进行改变的时候,加入到mutableObservedChangedKeyPaths中。 这个集合中的值,始终会是最新的值。 那么哪里会产生keypath值的变化呢?
实在这些属性的set方法中,实现了手动KVO进行监听。
只要外部对这些属性的值进行改变,这个集合就会更新同步。 在每一次的请求中,就会根据这个集合构建NSMutableURLRequest 。
第三步
1、
HTTPRequestHeaders 这个是可以自定义的请求头。 可以调用set方法赋值。
2、
一般我们请求都会按照key = value 的方式带上各种参数,GET方法参数直接加在URL上,POST方法放在body上,NSURLRequest 没有封装好这个参数的解析。 AFNetworking 提供了接口,让参数可以是NSDictionary ,NSArray ,NSSet这些类型,再由内部解析成字符串后赋给NSURLRequest。
queryStringSerialization是一个block,可以选择实现这个block,自己去解析。
AFQueryStringFromParameters 这个方法 就是AF提供的函数。 递归调用并解析。 效果如下:
- Printing description of parameters:
- {
- baz = (
- 1,
- 2,
- 3
- );
- foo = bar;
- }
- Printing description of query:
- baz[]=1&baz[]=2&baz[]=3&foo=bar
3、
HTTPMethodsEncodingParametersInURI中,包含的是GET,HEAD,DELETE 因为这几个method 的quey 都是拼接到URL后面的
而POST和PUT 都是把query 放到body中的。
其余部分:
Multipart协议
AFURLRequestSerialization是一个协议,只有requestBySerializingRequest一个方法。
AFHTTPRequestSerializer遵循了这个协议,他有几个子类
1.AFJSONRequestSerializer
2.AFPropertyListRequestSerializer
子类都实现了这个协议,实现具体的逻辑业务。