is there an easy way to get the http status code in the failure block from AFHTTPClient?

43,778

Solution 1

Ok, found the answer with the operation object

failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
       NSLog(@"error code %d",[operation.response statusCode]);
}];

Solution 2

In newer versions of AFNetworking, you can retrieve the response object from the error:

[[[error userInfo] objectForKey:AFNetworkingOperationFailingURLResponseErrorKey] statusCode]

This is handy if you're doing error handling further up the line and don't want to pass around the response object.

Solution 3

For AFNetworking 3.0, use

failure:^(NSURLSessionTask *operation, NSError *error) {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)operation.response;
    httpResponse.statusCode;
    NSLog(@"status code: %li", (long)httpResponse.statusCode);
}

Solution 4

NSInteger operationStatusCode = [operation.error code];

NSInteger httpStatusCode = operation.response.statusCode;

If the requests were cancelled/unreachable/timeout, httpStatusCode will be always 0.

Alternatively you can identify the issue by understanding the operationStatusCode. It is a NSError Object.

  • If it cannot reach/timeout/no network to process request, the operationStatusCode will be -1009.
  • If you cancel the operations queue the operationStatusCode will be -999.

You can check all other NSError codes and their descriptions in Apple's documentation

Solution 5

I've been able to get the status code with Swift 3:

((error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey])
    as! HTTPURLResponse).statusCode
Share:
43,778
MonkeyBonkey
Author by

MonkeyBonkey

CTO of Pictorious.com, a mobile app for turning photo sharing into a fun meme-game.

Updated on May 24, 2020

Comments

  • MonkeyBonkey
    MonkeyBonkey about 4 years

    I see that there is a list of accepted http status codes that I can modify, but I think it would be cleaner if I can get the http status code in the failure block ..

    Ok, found the answer with the operation object

    failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
            NSLog(@"error code %d",[operation.response statusCode]);
    }];
    
  • defvol
    defvol over 11 years
    This might be also helpful [operation.request HTTPMethod]
  • shortstuffsushi
    shortstuffsushi almost 11 years
    I know this is old, but @wilhelmbot -- HTTPMethod would give you something like GET/POST/PUT... etc, probably not helpful for checking response status.
  • Onato
    Onato over 9 years
    You might need to get the underlying error first. NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]