AFNetworking: блокировка отказа выполняется при возврате с 200 и без содержимого

Я использую AFNetworking для обработки запроса сброса пароля из моего мобильного приложения на мой сервер rails.

API возвращается: head :ok (результат 200)

Однако это приводит к тому, что AFNetworking запускает блок сбоя, когда я выдаю запрос getPath.

Я могу сделать две вещи, чтобы запустить блок успеха:

  1. вернуть API head :no_content (результат 204)
  2. не устанавливайте для моего заголовка Accept значение «application/json»

Похоже, что AFNetworking ожидает как минимум пустой массив, когда код состояния равен 200, а заголовок Accept равен application/json.

У меня нет полного контроля над API, поэтому возможно ли, чтобы 200 без содержимого по-прежнему вызывало мой блок успеха, или 204 предполагается использовать именно для этой ситуации, когда он успешен, но ничего не будет возвращено из сервер?

Спасибо!


person djibouti33    schedule 20.08.2012    source источник
comment
Черт, я только что столкнулся с точно таким же вариантом использования и не могу найти ничего, что упоминалось бы где-либо еще в сети.   -  person raidfive    schedule 02.10.2012


Ответы (1)


Вместо использования блоков успеха и завершения AFNetworking вы можете использовать AFHTTPRequestOperation и самостоятельно обрабатывать коды ответов. Например:

// Setup HTTP client
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://website.com"]];

// Create the request
NSURLRequest *request = [client requestWithMethod:@"GET" path:@"authenticate" parameters:params];

// Create an HTTP operation with your request
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

// Setup the completion block
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    switch (operation.response.statusCode) {
        case 200:
            // Do stuff
            break;
        default:
            break;
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    switch (operation.response.statusCode) {
        case 400:
            // Do stuff
            break;
        default:
            break;
    }
}];

// Begin your request
[operation start];
person Keith Smiley    schedule 12.11.2012
comment
Не используйте waitUntilFinished. Сетевые запросы всегда должны выполняться асинхронно. Вместо этого поместите любую логику, требующую ответа сервера, в файл completionBlock. - person mattt; 01.12.2012