1、先来看一个AFNetworking的方法[Objective-C] 纯文本查看 复制代码 - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure; 2、这是AFNetwroking最为常用的一个POST请求方法,该方法中的请求参数parameters我们一般是传入一个NSDictionary对象,而事实上AFNetworking在内部会将其遍历拼装成key1=value1&key2=value2这样的格式后加入到NSRequest请求当中去,具体不发散讲了,有兴趣的可以通过这个POST方法往里面一层一层去破开,最终在组建NSURLRequest能找到一段这样的代码[Objective-C] 纯文本查看 复制代码 NSString *query = nil;
if (parameters) {
if (self.queryStringSerialization) {
NSError *serializationError;
query = self.queryStringSerialization(request, parameters, &serializationError);
if (serializationError) {
if (error) {
*error = serializationError;
}
return nil;
}
} else {
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
query = AFQueryStringFromParameters(parameters);
break;
}
}
} 3、这里的关键是if (self.queryStringSerialization)这个判断,通过断点可以看到,正常情况下这个if条件永远都是不成立的,因为这个self.queryStringSerialization正常情况下为空,queryStringSerialization是AFHTTPRequestSerializer类的一个成员属性,并且是个block类型的属性![Objective-C] 纯文本查看 复制代码 typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id parameters, NSError *__autoreleasing *error); 还是一个带返回值的block4、说到这里才是重点,这个if条件不成立会进入下面那个else块,这个else块就是上面所说的将我们传入的参数转成key=value格式,但如果我们的服务端要求参数以json串的格式上传怎么办呢?(随着json的流行,这种做法现在越来越多了哦)
5、重点的重点就是这个queryStringSerialization属性了,这个block里面提供了request和parameters然后让我们返回一个NSString,这是什么意思呢?意思就是网络框架需要组装的NSURLRequest请求以及parameters都给你,让你利用这两个对象返回一个自定义的HttpBody体给框架,明白了吧。
6、这是一种规则,不需要在每次请求里面写,只需要在初始化网络引擎时指定就行了,以下示例代码供参考:[Objective-C] 纯文本查看 复制代码
[self.networkManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
// 将NSDictionary对象转成JSON字符串
return [NSString JSONStringWithObject:parameters];
}]; |