现在一般服务器POST使用的解析方式都是前两种。很少用JSON这种了。但是为了安全考虑,有一些企业还是会选择json的解析格式。看了网上很多解决方案。都饶了很多弯路。上代码
AFHTTPSessionManager *instance;
[instance.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
很多小伙伴都会尝试过,直接设置请求头中的requestSerializer这种方式。还是无法成功,请求以后返回500的错误码。500代表的是解析格式错误。也就是说你的后台使用的json的解析格式,而你的请求依然使用的是键值对的方式传body体。所以看到网上很多帖子都用了同一种方式。而且可以看出来都是同一片帖子超了又抄。上代码
// 1.设置请求地址
NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", HttpPreUrl, requestUrl]]];
// 2.设置 请求方式-请求头
[request setHTTPMethod:@"POST"];
if ([requestUrl isEqualToString:[BOEURLString addFavoriteWorkURL]]||[requestUrl isEqualToString:[BOEURLString deleteFavoriteWorkURL]]||[requestUrl isEqualToString:[BOEURLString showedFavoriteWorkPageListURL]]) {
[request setValue:User.userId forHTTPHeaderField:@"userId"];
}
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//3.设置body
NSData *body = [NSJSONSerialization dataWithJSONObject:bodyDict options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
// 4.执行请求任务
[[[self sharedManager] dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
....
}else {
// ......
}
}] resume];
可以看到非常麻烦,重新构造一个request请求。而且问题就在于。GET方法依然使用HTTPSessionManager,封装好的GET方法。而POST却重新封装?整体性看起来也不好
GET代码如下:
[instance GET:URLString parameters:parameters progress:downloadProgress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// DBLog(@"responseObject URLString-%@ - %@", responseObject, URLString);
.........
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
........
}];
POST也应该同样使用sessionmanager封装好的POST方法
[instance POST:URLString parameters:parameters progress:uploadProgress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
......
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
.......
}];
但是目前来说现在的,POST确实跑不通,会有500的报错。充分了解POST请求方式以后。我们可以看一下AFN的底层。其实AFN早就替我们处理好了。根本不需要重新构造Request请求。
instance.requestSerializer = [AFJSONRequestSerializer serializer];
在构造的单例里面。我们需要对request设置的这个对象里。直接使用AFJSON这个类。
看一下英文描述你就懂了。对,设置Content-type 是这样的 不能通过设置headerfield的content-type那种方式实现。这样设置才能改变AFN的框架传参形式。