2013-11-13 4 views
2

Я работаю над исправлением ошибки в существующем проекте. Проблема в том, что AFHTTPClient ожидает действительного ответа JSON, но сервер возвращает некоторую тарабарщину, такую ​​как «« \ «Операция завершена» (все кавычки и скобки находятся в обратном). Это приводит к сбою операции и удару блок отказа, потому что он не может проанализировать ответ. Несмотря на это, сервер возвращает код состояния 200 и счастлив, что операция завершена.Принимая недействительный JSON в AFJSONRequestOperation?

У меня есть класс, который расширяет AFHTTPClient, как это (exert from my .h файл)

@interface AuthClient : AFHTTPClient 

    //blah blah blah 

@end 

В моем файле реализации класса инициализируется следующим образом:

- (id)initWithBaseURL:(NSURL *)url{ 
    if (self = [super initWithBaseURL:url]) {   
     self.parameterEncoding = AFFormURLParameterEncoding; 
     self.stringEncoding = NSASCIIStringEncoding; 

     [self setDefaultHeader:@"Accept" value:@"application/json"]; 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
    } 

    return self; 
} 

вызов Я делаю это делается в классе, упомянутой выше, и бывает так:

- (void)destroyToken:(NSString *)token onCompletion:(void (^)(BOOL success))completion onFailure:(void (^)(NSError *error))failure{ 

    [self postPath:@"TheServerURL" parameters:@{@"token": token} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSError *error; 
     //Do some stuff 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     //Don't want to be here. 
    }]; 
} 

Внутри строя блока ошибка возвращается в разделе _userInfo объект ошибки как:

[0 ] (нуль) @ «NSDebugDescription»: @ «JSON текст не начать с массивом или объектом и возможностью разрешить фрагменты не установлен.»

код ошибки 3480.

От погуглить Аро и я понял, что мне нужно установить что-то вроде NSJSONReadingAllowFragments, но я не уверен, как/где данная текущая настройка. У кого-нибудь есть идеи?

+0

Когда сервер отвечает недействительным JSON, почему служба не исправлена? – CouchDeveloper

+0

Планирование сервера запланировано, но оно не будет нажато некоторое время. Это не поддается контролю. Однако это отбрасывает мой график тестирования. – Rob

ответ

1

Похоже, что ответ не является JSON вообще. Итак, почему бы просто не принять сам HTTP-ответ, а не пытаться обрабатывать его, как JSON, когда это не так?

Если вы подаете сформированный запрос JSON, но просто хочу текст ответа обратно, используя AFNetworking 2,0 вы можете сделать что-то вроде:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
[manager POST:urlString parameters:@{@"token":token} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
    NSLog(@"responseString: %@", string); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

Или в 1.x:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; 
client.parameterEncoding = AFJSONParameterEncoding; 
NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:@{@"token" : token}]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
    NSLog(@"response: %@", string); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

[client enqueueHTTPRequestOperation:operation]; 
+0

Я бы предпочел сделать то, что вы предложили, но это большой класс, и он работает на 98%. Это только одна конечная точка, которая возвращает недействительный JSON. Рефакторинг всего класса потребует обширной поездки обратно через QA, так что в настоящий момент это не вариант. Спасибо за отличный ответ. В 99% случаев это было бы идеальным ответом! Я знаю, что моя ситуация - краевой случай. – Rob

+0

@Rob (я чувствую, что я говорю сам с собой :) Понял (и спасибо за принятие, хотя я действительно не решил ваш вопрос). Можете ли вы изменить свой класс, чтобы всегда использовать 'AFHTTPRequestOperation', а затем вызывать' JSONObjectWithData', возвращая объект JSON, если этот вызов преуспел, и 'NSData', если нет? Похоже на потенциальное изменение, которое не нарушит остальную часть вашего кода. Очевидно, что, как предположил CouchDeveloper, лучшим решением является исправление веб-службы для возврата JSON (возможно, так условно, проверка параметра «Accept» запроса для обеспечения обратной совместимости, если это необходимо). – Rob