AFNetworking 2.0在代码块400中从代码400获取JSON

我正在使用AFHTTPRequestOperationManager POST请求。 现在我故意input不正确的信息来处理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); }]; 

不会像成功块中的那样传递响应对象。 那么有没有人知道我可以访问由Web服务返回的400错误的JSON? NSError *error只是给我Request failed: bad request (400)而不是返回的JSON。

任何帮助,将不胜感激,
麦克风

查看- responseObject的代码,看起来HTTP错误阻止了它被填充。 你可以直接抓取responseData并自己parsing,但是我会说这是一个bug或者一个很好的增强请求。 (看起来像- responseObject可能应该检查self.responseSerializationError ,而不是self.error ,当它决定是否应该尝试构build一个响应对象。)

你可以做任何一种解决scheme

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

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

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

专家提示 :AFNetworking是开源的,只是看看AFHTTPRequestOperation的方法

 setCompletionBlockWithSuccess:failure: responseObject error 

在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 

谢谢,

以下代码措辞对我来说:

 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]; }];