AFN总结,content-typ为application/json

AFN总结,content-typ为application/json

现在一般服务器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这个类。

www.zeeklog.com  - AFN总结,content-typ为application/json

看一下英文描述你就懂了。对,设置Content-type 是这样的 不能通过设置headerfield的content-type那种方式实现。这样设置才能改变AFN的框架传参形式。