1、先来看一个AFNetworking的方法
1 2 3 4 5 | - (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能找到一段这样的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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类型的属性!
1 | typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id parameters, NSError *__autoreleasing *error); |
还是一个带返回值的block
4、说到这里才是重点
这个if条件不成立会进入下面那个else块,这个else块就是上面所说的将我们传入的参数转成key=value格式,但如果我们的服务端要求参数以json串的格式上传怎么办呢?(随着json的流行,这种做法现在越来越多了哦)
5、重点的重点就是这个queryStringSerialization属性
这个block里面提供了request和parameters然后让我们返回一个NSString,这是什么意思呢?意思就是网络框架需要组装的NSURLRequest请求以及parameters都给你,让你利用这两个对象返回一个自定义的HttpBody体给框架,明白了吧。
6、这是一种规则,不需要在每次请求里面写,只需要在初始化网络引擎时指定就行了,以下示例代码供参考:
1 2 3 4 | [self.networkManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id? _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) { ????// 将NSDictionary对象转成JSON字符串 ????return [NSString JSONStringWithObject:parameters]; }]; |
Hi, this is a comment.
To delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.