主题:
网络请求模块(输入、输出)。
概要:
根据不同入参, 返回对应的数据格式request。
- request中包含请求头配置 ,url , 参数(urlcode,json,xml, 文件上传表单)。
- 位置:
AFURLRequestSerialization.m
核心:
参数的处理。
1. 入口:
NSString *urlstr = @"https://www.xxx.com/api/xxx/user/profile/";
NSDictionary *param = @{@"versions_id":@"1", @"system_type":@"1"};
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLSessionTask *task = [manager POST:urlstr parameters:param progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];
[task resume];
2. 在AFHTTPSessionManager
中,有一个AFHTTPRequestSerializer
属性:self.requestSerializer
;
// AFHTTPSessionManager.m p262
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
}
它的初始化如下:
//AFHTTPSessionManager.m p82
self.requestSerializer = [AFHTTPRequestSerializer serializer];
- 也就是说
AFHTTPSessionManager
默认处理的是urlcode
表单格式;
3. 方法的内部实现;
// AFURLRequestSerialization.m p360
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
error:(NSError *__autoreleasing *)error
{
NSParameterAssert(method);
NSParameterAssert(URLString);
NSURL *url = [NSURL URLWithString:URLString];
NSParameterAssert(url);
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
mutableRequest.HTTPMethod = method;
//1. 对请求头的配置,入口设置是没有配置请求头的,所以此处为空
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
[mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
}
}
// 2. 转换参数
mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];
return mutableRequest;
}
4. 此处 对请求头的配置,入口设置是没有配置请求头的,所以此处为空;

5. 转换参数:把字典转换成urlcode
表单格式;
mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];
//AFURLRequestSerialization.m p478
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(id)parameters
error:(NSError *__autoreleasing *)error
{
>>>>
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
//1. 将字典转换成表单格式
query = AFQueryStringFromParameters(parameters); // urlcode表单操作
break;
}
>>>>
}
query = AFQueryStringFromParameters(parameters)
这一步就是完成字典转表单功能.
6. 配置表单Content-Type
.
//AFURLRequestSerialization.m p526
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
}
// urlcode
[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
7. 以上为Request模块流程分析,默认配置为urlcode表单格式;
- 使用Json格式请求设置如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
网友评论