Не удается получить ответ 401 (неавторизованный) из приложения для iPhone - PullRequest
2 голосов
/ 07 января 2011

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

+ (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 error -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 Ответ

1 голос
/ 21 февраля 2011

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

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

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

...