94

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]);
}];
MonkeyBonkey
  • 46,433
  • 78
  • 254
  • 460

6 Answers6

136

Ok, found the answer with the operation object

failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
       NSLog(@"error code %d",[operation.response statusCode]);
}];
MonkeyBonkey
  • 46,433
  • 78
  • 254
  • 460
112

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.

Sam
  • 4,694
  • 2
  • 36
  • 47
  • You might need to get the underlying error first. `NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]` – Onato Oct 06 '14 at 09:33
19

For AFNetworking 3.0, use

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

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

Benjohn
  • 13,228
  • 9
  • 65
  • 127
c0deslayer
  • 515
  • 5
  • 7
7

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

((error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey])
    as! HTTPURLResponse).statusCode
hasan
  • 23,815
  • 10
  • 63
  • 101
0

It's work for me Add below line to your request

manager.requestSerializer = [AFJSONRequestSerializer serializer];