Не удается получить ответ 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