AFNetworking3.0 自定义Request请求HttpBody格式

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];
}];

One thought on “AFNetworking3.0 自定义Request请求HttpBody格式

Leave a Reply