AFNetworking 2.0 从故障块中的代码 400 获取 JSON

Posted

技术标签:

【中文标题】AFNetworking 2.0 从故障块中的代码 400 获取 JSON【英文标题】:AFNetworking 2.0 Get JSON from code 400 in failure block 【发布时间】:2013-10-26 15:56:42 【问题描述】:

我正在使用 AFHTTPRequestOperationManager 发送 POST 请求。现在我故意输入错误信息来处理400 错误代码。现在,Web 服务实际上返回了一个JSON,其中包含一条向用户解释他们做错了什么的消息。我非常想让这个JSONUIAlertView 中显示消息。但是,故障块:

[operationManager POST:ServerURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"Success: Status Code: %d", operation.response.statusCode);

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
     NSLog(@"Failed: Status Code: %d", operation.response.statusCode);
 ];

不会像成功块中的那样传递 responseObject。那么有谁知道我如何访问带有 400 错误的 Web 服务返回的 JSON? NSError *error 只是给了我Request failed: bad request (400) 而不是返回的 JSON。

任何帮助将不胜感激,迈克

【问题讨论】:

我得到了同样的回复,你有解决问题的办法吗? 这个答案对我有用,***.com/a/24645209/646553 【参考方案1】:

查看- responseObject 的代码,HTTP 错误似乎阻止了它被填充。您可以直接获取responseData 并自己解析它,但我会说这要么是一个错误,要么是一个很好的增强请求。 (看起来- responseObject 在决定是否应该尝试构建响应对象时可能应该检查self.responseSerializationError,而不是self.error。)

【讨论】:

嘿,杰西,非常感谢您的出色回答,非常详细。我现在可能会窥探自己,看看我能不能做出一点改变,但我们会拭目以待。 有什么办法可以在 json 中返回服务器响应。还没! 您可能已经解决了这个问题,但是您可以从失败块中的 AFHTTPRequestOperation 对象中获取 responseObject @tbag 问题是失败块中responseObject为nil。 Github 上有很多关于这个的问题,但是 Matt 说这会破坏 API 设计【参考方案2】:

你可以做这些解决方案中的任何一个

1) 设置acceptableStatusCodes 接受你的400 statusCode,然后你在成功块中处理

manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];

2) 创建一个自定义的ResponseSerializer,像JSONResponseSerializerWithData,将responseObject插入到NSError userInfo中,并在失败块中处理

专业提示:AFNetworking 是开源的,只需查看 AFHTTPRequestOperation 的方法即可

setCompletionBlockWithSuccess:failure:

responseObject

error

【讨论】:

【参考方案3】:

我在 AFNetworking 中也遇到了同样的问题,而不是使用

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                parameters:(id)parameters
                  progress:(void (^)(NSProgress * _Nonnull))uploadProgress
                   success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                   failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure

请尝试使用那个:-

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                parameters:(id)parameters
 constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                  progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                   success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

谢谢,

【讨论】:

【参考方案4】:

以下为我编写的代码:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [manager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    manager.securityPolicy.allowInvalidCertificates = YES;

    NSString *URLString = [NSString stringWithFormat:@"%@/%@", BASE_URL,methodName];



    [manager POST:URLString parameters:requestDict success:^(AFHTTPRequestOperation *operation, id responseObject)
    
        NSLog(@"JSON: %@", responseObject);

        [myDelegate StopIndicator];
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"Error: %@", error);
        [myDelegate StopIndicator];
    ];

【讨论】:

以上是关于AFNetworking 2.0 从故障块中的代码 400 获取 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在故障块 AFNetworking 3.0 上获取 responseObject

AFNetworking 2.0 和单元测试

PHP REST 服务中的 JSON 格式问题从 AFNetworking 2.0 接收 POST

为啥这个 AFNetworking 块中的变量都显示为 nil(快速)?

具有大型 JSON 响应的 AFNetworking 2.0

从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题