iOS 使用AFNetworking传输字符串

Wynter_WangIP属地: 青海
0.121字数 287

通常网络请求使用AFNetworking我们都会将字典作为参数传给服务端,如果应用对数据的安全级别要求较高,这时肯定会将参数加密后再传输,那么上传的参数就变成一串看不懂的字符串,我们只需要设置AFHTTPSessionManager中几个类型即可直接上传字符。

配置参数请求和接收类型

+ (AFHTTPSessionManager *)getRequstManager {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 30;
    manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Content-Type"];
    return manager;
}

配置完成后发送请求,可能会发现服务端接收的字符串前面莫名的多出'='符号,查看源码发现AFURLRequestSerialization文件中下面的方法引起的

- (NSString *)URLEncodedStringValue {
    if (!self.value || [self.value isEqual:[NSNull null]]) {
        return AFPercentEscapedStringFromString([self.field description]);
    } else {
        return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
    }
}

顺藤摸瓜发现AFQueryStringFromParameters函数中使用到了- URLEncodedStringValue方法。发现如下代码使用到了AFQueryStringFromParameters函数,如果实现self.queryStringSerialization属性就可以解决'='问题。

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

解决'='方法

AFHTTPSessionManager *manager = [self sessionManager];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
    return paramsStr;
}];
[manager POST:urlStr parameters:paramsStr progress:^(NSProgress * _Nonnull uploadProgress) {
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
}];

总结

  • 不建议修改直接源码达到去掉'='目的,通常可能因为源码版本更新而遗忘。
  • 如果使用原生网络请求可以直接通过[request setHTTPBody:data]来实现字符串或其他数据传输。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
2人点赞
总资产209共写了2.0W字获得175个赞共54个粉丝

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 谢谢自己,在最累最苦的时候没有放弃; 谢谢自己,在如山的压力中选择了坚持。 谢谢自己,在最孤单的时候勇敢一个人赶路...
    我是韩卓阅读 268评论 0 0
  • 夜色坠入湖心 高楼破碎 云彩逐渐隐去 夕阳沉醉 暮霭凝成一条线 炊烟散落 我松开你的手 你不爱我
    四缄阅读 199评论 0 4
  • 这段时间主要做气象这一块的数据计算,想拓展下自己,看到简书里面有很多关于python的文章,看了几篇觉得很好,希望...
    东东快跑阅读 176评论 0 0