iOS开发笔记 一天到晚游泳的余

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 478|回复: 0

[框架接口] AFNetworking3.0 自定义Request请求HttpBody格式

[复制链接]
  • TA的每日心情
    发光
    2019-4-19 14:50
  • 签到天数: 366 天

    [LV.9]以坛为家II

    发表于 2016-7-8 11:53:59 | 显示全部楼层 |阅读模式
    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];
            }];
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2020-4-8 05:56 , Processed in 0.114627 second(s), 23 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表