Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AFNetworking 2.0 Get JSON from code 400 in failure block

I'm using AFHTTPRequestOperationManager for a POST request. Now I'm deliberately entering incorrect information to handle a 400 error code. Now, the web service actually returns a JSON with a message explaining to the user what they've done wrong. I would very much like to get this JSON to display the message in a UIAlertView. However, the failure block of:

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

doesn't pass down a responseObject like the one in the success block. So does anyone know how I can access the JSON returned by the Web Service with the 400 error? The NSError *error simply gives me Request failed: bad request (400) and not the JSON returned.

Any help would be appreciated,
Mike

like image 496
Mackey18 Avatar asked Oct 26 '13 15:10

Mackey18


2 Answers

Looking at the code for - responseObject, it appears that an HTTP error prevents it from being populated. You can grab the responseData directly and parse it yourself, but I would say this is either a bug or a good enhancement request. (It looks like - responseObject probably should be checking self.responseSerializationError, not self.error, when deciding if it should try to build a response object.)

like image 152
Jesse Rusak Avatar answered Sep 21 '22 22:09

Jesse Rusak


You can do either of these solutions

1) Set the acceptableStatusCodes to accept your 400 statusCode, and you handle in the success block

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

2) Create a custom ResponseSerializer, like this JSONResponseSerializerWithData, to insert the responseObject into the NSError userInfo, and handle in the failure block

Pro tip: AFNetworking is opensource, just take a look at AFHTTPRequestOperation for methods

setCompletionBlockWithSuccess:failure:

responseObject

error
like image 22
onmyway133 Avatar answered Sep 24 '22 22:09

onmyway133