最新因为项目的需求,需要使用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的源码。
以上。