4 AFURLRequestSerialization

这个方法就是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提供的函数。 递归调用并解析。 效果如下:
 
  1. Printing description of parameters:
  2. {
  3.     baz = (
  4. 1,
  5. 2,
  6. 3
  7. );
  8.     foo = bar;
  9. }
 
  1. Printing description of query:
  2. baz[]=1&baz[]=2&baz[]=3&foo=bar
 
 
 
3、
HTTPMethodsEncodingParametersInURI中,包含的是GET,HEAD,DELETE 因为这几个method 的quey 都是拼接到URL后面的
而POST和PUT 都是把query 放到body中的。 
 
 
 
 
其余部分:
 
Multipart协议
https://my.oschina.net/cnlw/blog/168466
http://www.cnblogs.com/polobymulberry/p/5170093.html
 
 
 
AFURLRequestSerialization是一个协议,只有requestBySerializingRequest一个方法。
 
AFHTTPRequestSerializer遵循了这个协议,他有几个子类
1.AFJSONRequestSerializer 
2.AFPropertyListRequestSerializer 
 
子类都实现了这个协议,实现具体的逻辑业务。 

转载于:https://www.cnblogs.com/JShuo/p/8678213.html

你可能感兴趣的:(4 AFURLRequestSerialization)