iOS使用AFNetworking报错Domain=NSCocoaErrorDomain Code=3840,response Code=-1011 ,http请求报错404解决方法

本文深入分析了使用AFNetworking进行网络请求时遇到的404错误问题,详细介绍了如何通过调整参数避免因JSON格式化导致的数据长度变化,从而解决服务器解析问题。

最近在使用AFNetworking进行网络请求时候出了一个bug解决了很久,打印error 显示Domain=NSCocoaErrorDomain Code=3840,Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed:not found(404)"。一想怎么会404呢。使用的是post请求,请求代码如下:

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:EnergyManagementURL]];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",nil];
    [manager POST:postPath parameters:JSONObjectParameter headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (handler) {
            handler(responseObject);
        }
    } failure:^(NSURLSessionDataTask *task, NSError * error) {
        if (failHandler) {
            failHandler();
        }
    }];

后台那边没有问题,用postman测试能拿到数据,但是怎么会404呢,于是就想到会不会是在上传parameter中对manager的设置出来问题。但是发现也没有问题,使用是AFJSONRequestSerializer和AFJSONResponseSerializer而非AFHTTPRequestSerializer与AFHTTPResponseSerializer。后面在多次对照前后台传入的参数后终于找到了问题所在。原因如下:

在NSJSONWritingPrettyPrinted这个模式下,为了好看,其生成的子串是会带空格的,所以造成所编成data之后其长度变长了,服务器那边解析就会出现问题。解决方法是,把这个参数改成0即可。具体修改如下:


    AFJSONRequestSerializer *rqSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:0];//NSJSONWritingPrettyPrinted 设置为0
    rqSerializer.stringEncoding = NSUTF8StringEncoding;

    AFJSONResponseSerializer *rsSerializer = [AFJSONResponseSerializer serializer];
    rsSerializer.stringEncoding = NSUTF8StringEncoding; 
    
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:EnergyManagementURL]];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",nil];
    [manager POST:postPath parameters:JSONObjectParameter headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (handler) {
            handler(responseObject);
        }
    } failure:^(NSURLSessionDataTask *task, NSError * error) {
        if (failHandler) {
            failHandler();
        }
    }];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值