Sian 发表于 2016-7-8 11:53:59

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

1、先来看一个AFNetworking的方法- (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能找到一段这样的代码    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类型的属性!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、这是一种规则,不需要在每次请求里面写,只需要在初始化网络引擎时指定就行了,以下示例代码供参考:
      [self.networkManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id_Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
            // 将NSDictionary对象转成JSON字符串
            return ;
      }];
页: [1]
查看完整版本: AFNetworking3.0 自定义Request请求HttpBody格式