получение ответа об ошибке с вызовами AFHTTPClient

Я реализую AFHTTPClient как одноэлементный класс, как рекомендовано в документах, и вызываю его с данными JSON в сообщении и получаю взамен данные JSON:

[[BMNetworkCalls sharedInstance] postPath:theURL parameters:theDict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"my return is: %@", [responseObject valueForKeyPath:@"Result"]);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {            
    NSLog(@"error in network call: %@", [error localizedDescription]);
}];

Все хорошо и хорошо, но если я получаю сообщение об ошибке ("ошибка в HTTPRequestOperation: ожидаемый код состояния в (200-299), получено 400"), я на самом деле хочу прочитать здесь responseObject. (именно так API, который я использую, сообщает мне, какой класс ошибки я вызвал).

Я мог бы сделать это с помощью AFJSONRequestOperation:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"my return is: %@", [JSON valueForKeyPath:@"Result"]);

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"exception code: %@", [JSON valueForKeyPath:@"ExceptionCode"]);
    NSLog(@"exception message: %@", [JSON valueForKeyPath:@"ExceptionMessage"]);
}];
[operation start];

Как я могу (и могу ли я?) сделать это с помощью AFHTTPClient?


person coco    schedule 07.06.2012    source источник
comment
Вы должны написать собственный метод в BMNetworkCalls для каждого вызова API.   -  person Felix    schedule 08.06.2012


Ответы (2)


В переменной operation есть все, что вам нужно:

[[BMNetworkCalls sharedInstance] postPath:theURL parameters:theDict success:^(AFHTTPRequestOperation *operation, id responseObject) {
  // ...
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    if ([operation isKindOfClass:[AFJSONRequestOperation class]]) {
      id JSON = [(AFJSONRequestOperation *)operation responseJSON];
      NSLog(@"JSON: %@", JSON)
    }
}];
person mattt    schedule 09.06.2012
comment
СЕЙЧАС ты мне скажи.. (усмехается). Обратите внимание, что мой ответ ниже работает, даже если он не нужен. - person coco; 04.07.2012

Вся заслуга принадлежит @phix23, который указал мне правильное направление!

Вот пользовательский метод, который я написал в своем подклассе AFHTTPClient, который позволяет мне видеть ответ JSON после получения ошибки 400:

- (void) myPostPath:(NSString *)path
        parameters:(NSDictionary *)parameters
           success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON))success 
           failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON))failure
{
    NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters];   
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:success failure:failure];
    [self enqueueHTTPRequestOperation:operation];
}

Я называю это по:

[[BMNetworkCalls sharedInstance] myPostPath:theURL parameters:theDict success:^(NSURLRequest *request, NSHTTPURLResponse *response, id responseObject) {
    NSLog(@"my return is: %@", [responseObject valueForKeyPath:@"Result"]);

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {          
    NSLog(@"exception code: %@", [JSON valueForKeyPath:@"ExceptionCode"]);
}];
person coco    schedule 08.06.2012
comment
Это не нужно. Вы можете получить доступ к свойству responseJSON рабочей переменной, которая обычно передается в блоке обратного вызова при ошибке. - person mattt; 09.06.2012