AFNetworking 2.0在代码块400中从代码400获取JSON
我正在使用AFHTTPRequestOperationManager
POST
请求。 现在我故意input不正确的信息来处理400
错误代码。 现在,Web服务实际上返回一个JSON
,并向用户解释他们做错了什么。 我非常希望得到这个JSON
在UIAlertView
显示消息。 但是,以下的失败块:
[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]; }];