AFNetWorking3.0 http post 字符串

最新因为项目的需求,需要使用http post一个字符串到服务器,使用的是afn3.0,研究了一天,先上代码

- (void)httpPostWithSerializerRequest:(NSString *)urlString parameters:(id)parameters result:(void (^)(ResultInfo *resultInfo, id returnObject))result networkFailure:(void (^)(NSError *networkError))networkFailure{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //申明请求的数据类型设置
    manager.requestSerializer=[AFHTTPRequestSerializer serializer];
    //返回数据类型设置
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", @"text/json", @"text/javascript" ,nil];
    [manager.requestSerializer setValue:@"text/plain;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //返回数据的处理逻辑
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        DLog(@"Error: %@", error);
    }];
}


其中因为post的是utf-8的字符串,所以 

//申明请求的数据类型设置
manager.requestSerializer=[AFHTTPRequestSerializer serializer];
[manager.requestSerializer setValue:@"text/plain;charset=utf-8" forHTTPHeaderField:@"Content-Type"];

如果没有设置http请求头,会报错:

Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)"


另外根据服务器的返回数据类型,我服务器返回的是字符串,所以:

//返回数据类型设置
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", @"text/json", @"text/javascript" ,nil];
这个如果没有设置对,也会报错,不过比较好解决,根据返回的错误码百度就行。


做到以上这些,通过http 抓包工具(使用charles,教程自己查,使用非常方便)发现,post的字符串前面会加上一个“=”号,比如你post一个“123”,抓到的包变成了“=123”,这显然不是我们想要的结果。

通过阅读afn3.0的源码发现在AFURLRequestSerialization 中的 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])];
    }
这里如果想屏蔽afn给你post字符串的处理,可以修改为:

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

通过以上的修改,你就利用afn3.0 http post一个NSString 给服务器了。

当然,你要评估你的修改会不会给你项目中其他的http post造成什么影响,毕竟是改afn的源码。

以上。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值