本文主要内容是讲AFNetworking中的AFURLRequestSerialization。它主要的作用是在我们要发送一个网络请求的时候帮助我们创NSMutableURLRequest并封装好所需要的参数到NSMutableURLRequest中。那它内部做了些什么,提供了什么功能,使得我们进行网络请求时候变得如此方便、简单。好像我们什么都不用管就能建立一个正确的请求体NSURLRequest。接下来就会一步步揭开它神秘的面纱。
概览
首先看一下在AFURLRequestSerialization.h和AFURLRequestSerialization.m中所包含的类及它们间的关系,及各部分的功能。
AFURLRequestSerialization协议:定义了一个如下方法,各子类会根据自己需要有自己的实现
- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request withParameters:(nullable id)parameters error:(NSError * _Nullable __autoreleasing *)error
下面写个伪代码说明AFHTTPRequestSerializer、AFJSONRequestSerializer、AFPropertyListRequestSerializer功能(这个很重要!!!)。
if (请求方式为:get || head || delete) { AFHTTPRequestSerializer、AFHTTPRequestSerializer、AFHTTPRequestSerializer 其实都调到了AFHTTPRequestSerializer的 - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request withParameters:(id)parameters error:(NSError *__autoreleasing *)error 然后把parameters拼结成URL参数加到URL后面作为请求的一部分。 } else if (表单提交) { AFHTTPRequestSerializer、AFHTTPRequestSerializer、AFHTTPRequestSerializer就会 都调用到AFHTTPRequestSerializer的 - (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(nullable NSDictionary <NSString *, id> *)parameters constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block error:(NSError * _Nullable __autoreleasing *)error; 在这里面就会用到AFStreamingMultipartFormData,此时parameters及通过AFStreamingMultipartFormData添 加进来的数据都会变一项项的AFHTTPBodyPart存起来,当上传系统需要读数据时就通过AFHTTPBodyPart取数据。 } else //即((put||post||patch) && !单提交时) { AFHTTPRequestSerializer:把parameters拼接成字符串后(如何拼接细节后面写) 序列化成NSData放到HTTPRequest的HTTPBody中。 AFJSONRequestSerializer:把parameters以dataWithJSONObject方式序列化 成NSData放到HTTPRequest的HTTPBody中。 AFPropertyListRequestSerializer:把请求parameters以dataWithPropertyList 方式序列化成NSData放到HTTPRequest的HTTPBody中。 }
AFMultipartFormData协议:定义了一些接口方法,允许用户可以用不同的方式添加表单的内容,如:使用文件路径、直接用NSData、或使用inputStream等。
AFStreamingMultipartFormData:遵循了AFMultipartFormData协议,把协议的方法都实现了。
AFMultipartBodyStream:它起着一个重要桥梁作用,上传表单数据时系统会先调到它,然后它会依赖AFHTTPBodyPart读到数据,然后把数据返回给系统调用。
AFHTTPBodyPart:每一个AFHTTPBodyPart就是代表一项表单数据,由它真正读取它内部的数据(不管是以什么形式存在的:文件路径,NSData,又或者NSInputStream)。
实现细节
接下来(未完待续...)