2014-02-20 2 views
1

При запросе моего веб-сервиса с i.e Postman Rest Client с If-Modified-так как я получаю правильный ответ с 304 и без данных в контенте.AFNetworking и 304 NotModified возвращает ошибку

Однако, когда я делаю это из моего приложения, я получаю следующее сообщение об ошибке:

Ошибка: Не удалось выполнить запрос: не изменен (304), получили 256

Это, как я инициализацией запрос :

NSMutableURLRequest *request = [requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:@"myUrl" relativeToURL:[baseURL absoluteString] parameters:nil]; 

self = [self initWithRequest:request]; 

[request setValue:modifyDate forHTTPHeaderField:@"If-Modified-Since"]; 

Это моя работа:

[self setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id JSON) 
{ 
    DLog(@"Response: %@", [operation responseString]); 

    int statusCode = operation.response.statusCode; 
    if(statusCode == 304) //NotModified 
    { 
     DLog(@"This is where i want to go"); 
    } 
    success(); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    DLog(@"ERROR RESPONSE: %@", [operation responseString]); 
    DLog(@"This is where I get"); 
}]; 

responseString в блок ошибок является emtpy.

Это то, что дает ошибку, когда я печатаю его:

Printing description of error: 
Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: not modified (304), got 256" UserInfo=0x8a7dd10 {NSErrorFailingURLKey=http://myApiUrl, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x8acc5e0> { URL: http://10.225.80.63/api/getAllRegionsAndCancertypes } { status code: 304, headers { 
    "Cache-Control" = "no-cache"; 
    Date = "Thu, 20 Feb 2014 10:23:10 GMT"; 
    Expires = "-1"; 
    Pragma = "no-cache"; 
    Server = "Microsoft-IIS/7.5"; 
    "X-AspNet-Version" = "4.0.30319"; 
    "X-Powered-By" = "ASP.NET"; 
} }, NSLocalizedDescription=Request failed: not modified (304), got 256} 

Что мне не хватает? Статус кажется правильным даже в блоке ошибок, но почему я вообще туда попал?

Спасибо!

+0

Код 304 уже используется AFNetworking и означает (данные не изменены), тогда вы можете посмотреть в своем кеше, чтобы получить данные. Но это не может быть успешным с кодом 304. –

+0

. Должна быть ошибка, когда ответ равен 304? – ullstrm

+0

Будет ли только код состояния 200 перейти к блоку успеха? – ullstrm

ответ

4

По умолчанию AFNetworking рассматривает только 200 как успех, но есть способ указать коды состояния, которые следует рассматривать как успех. Вы можете сделать это, используя сериализацию ответа, вот код

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

AFHTTPResponseSerializer *respSerializer = [AFHTTPResponseSerializer serializer]; 
NSMutableIndexSet *responseCodes = [NSMutableIndexSet indexSet]; 
[responseCodes addIndex:200]; 
[responseCodes addIndex:304]; 
respSerializer.acceptableStatusCodes = responseCodes; 

[operation setResponseSerializer:respSerializer]; 

с этим кодом AFNetworking будет относиться к 304, как успех, и он будет вызывать блок успеха.

+0

Пытался отредактировать это, но получил отклонение. Horray !! : "respSerializer.acceptableStatusCodes = responseCodes;" – ullstrm

+0

Я добавил его для вас @Spoek – Sean

1

Я хочу предложить свой вариант решения этой проблемы. Если вы используете AFNetworking 3,0 и работать с AFHTTPSessionManager в классе singletone запрос по:

AFHTTPSessionManager *sessionManager = ... 
... 
NSMutableIndexSet *responseCodes = [[NSMutableIndexSet alloc] initWithIndexSet:sessionManager.responseSerializer.acceptableStatusCodes]; 
// Add code 304 in 'success list' 
[responseCodes addIndex:304]; 

sessionManager.responseSerializer.acceptableStatusCodes = responseCodes; 
... 

Такой подход не нарушает конфигурацию responseSerializer (если вы используете AFJSONResponseSerializer, например).

Смежные вопросы