Не удается получить ответ 401 (неавторизованный) из приложения для iPhone

У меня есть синхронный метод для отправки запросов, который выглядит следующим образом:

+ (NSString *)sendRequest:(NSMutableURLRequest *)request {
    NSHTTPURLResponse *response;
    NSError *error;

    NSData *responseData = 
 [NSURLConnection sendSynchronousRequest:request                         
        returningResponse:&response 
           error:&error];

 NSLog(@"response = %@", response);
 NSLog(@"error = %@", [error localizedDescription]);

    NSString *responseString = 
 [[NSString alloc] initWithData:responseData 
        encoding:NSUTF8StringEncoding];
    [responseString autorelease];

    NSLog(@"%@: %@", [request HTTPMethod], [request URL]);
    NSLog(@"Response Code: %d", [response statusCode]);
    NSLog(@"Content-Type: %@", [[response allHeaderFields] 
                                objectForKey:@"Content-Type"]);
    NSLog(@"Response: %@\n\n", responseString);   

    return responseString;
}

На конкретный запрос я получаю нулевой ответ с ошибкой "Операция не может быть завершена (ошибка NSURLErrorDomain -1012.)"

В соответствии со ссылкой на константы Foundation этот код представляет собой NSURLErrorUserCancelledAuthentication, который описывается как

Возвращается, когда пользователь отменяет асинхронный запрос на аутентификацию.

Обычно это происходит при нажатии кнопки "Отмена" в диалоге имени пользователя / пароля, а не при попытке аутентификации пользователя.

Тем не менее, я не нажимаю кнопку отмены. Я просто делаю запрос на получение списка событий без авторизации, и поэтому возвращаемый мной 401 должен выдать неавторизованный ответ, а не нулевой ответ с ошибкой NSURLErrorUserCancelledAuthentication. Мой код Rails, который возвращает этот ответ, выглядит следующим образом:

def require_auth
    # Return unauthorized if the API call was not made by an authorized user
    unless current_user
      respond_to do |format|
        #format.json { render :text => "Unauthorized", :status => :unauthorized }
        format.json { head :unauthorized }
        format.xml { head :unauthorized }
      end
    end   
end

и вывод из моего журнала Rails выглядит так:

Started GET "/events.json" for
127.0.0.1 at Fri Jan 07 10:51:47 -0500 2011   
Processing by EventsController#index as JSON Completed 401 Unauthorized in 0ms

Кто-нибудь знает, почему это происходит и как создать правильный ответ?

1 ответ

Я скорее парень из Rails, чем парень из iPhone, но быстро гуглющий (см. Нить здесь: http://discussions.apple.com/thread.jspa?messageID=7915337), что NSURLConnection возвращает NSHTTPURLResponse только в случае успеха (200) и в противном случае возвращает нулевой ответ и поведение, которое вы видите на 401.

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

Этот другой поток Stackru, кажется, подразумевает, что асинхронная версия API позволит вам получить все коды ответов и данные: iOS: Как я могу получить HTTP 401 вместо -1012 NSURLErrorUserCancelledAuthentication

Другие вопросы по тегам