Как увидеть ошибку json POST с помощью AFNetworking?
-
22-12-2019 - |
Вопрос
После просмотра POST-запрос с помощью AFNetworking 2.0 — AFHTTPSessionManager Я не вижу, где можно найти сообщение об ошибке.
Это моя установка:
-(id)init
{
if ((self = [super init])) {
NSURL *url = [NSURL URLWithString:DebugURLString];
self.session = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
self.session.requestSerializer = [AFJSONRequestSerializer serializer];
self.session.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
}
return self;
}
-(void) login:(NSString *)email pwd:(NSString *)pwd result:(void(^)(NSError* result))handler
{
NSDictionary *params = @{@"username": email, @"password":pwd};
[self.session POST:@"auth/api-token/" parameters:params
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@", responseObject);
handler(nil);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", task);
NSLog(@"%@", error.userInfo);
handler(error);
}];
}
Я звоню http://www.django-rest-framework.org/api-guide/authentication#tokenauthentication, непосредственно rest_framework.authtoken.views.obtain_auth_token
которые запрашивают имя пользователя и пароль и возвращают токен.
Если пользователь/пароль верны, все работает нормально.Но если нет, я получу:
error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey]
<NSHTTPURLResponse: 0xb388f20> { URL: http://localhost:8000/auth/api-token/ } { status code: 400, headers {
Allow = "POST, OPTIONS";
"Content-Type" = "application/json";
Date = "Sat, 11 Jan 2014 02:14:13 GMT";
Server = "WSGIServer/0.1 Python/2.7.5";
Vary = "Accept, Cookie";
} }
Однако, когда я делаю тот же вызов с запросами Python +, я получаю:
{u'non_field_errors': [u'Unable to login with provided credentials.']}
Но я не нахожу его в NSError
.
Кроме того, несмотря на это, я установил responseSerializer
, он сообщает в задаче:
(lldb) po task.response
<NSHTTPURLResponse: 0xb388f20> { URL: http://localhost:8000/auth/api-token/ } { status code: 400, headers {
Allow = "POST, OPTIONS";
"Content-Type" = "application/json";
Date = "Sat, 11 Jan 2014 02:14:13 GMT";
Server = "WSGIServer/0.1 Python/2.7.5";
Vary = "Accept, Cookie";
Вместо JSon.Что мне нужно исправить?
Решение
Вы попали в галтель из AFNetworking
v2 — по умолчанию тело ответа не передается в блок отказа. Подробности можно узнать в обсуждении на Github..
Суть в том, что вам нужно создать подкласс AFJSONResponseSerializer
для того, чтобы добавить необходимые вам данные ответа в userInfo
словарь NSError
в течение responseObjectForResponse:data:error:
.(После этого вы сможете получить к нему доступ.)
Ваш вопрос побудил меня вернуться к Проблема с Github (как указано выше).Теперь есть сообщение в блоге и репозиторий с примером подкласса доступный.
Надеюсь, все это поможет.
AFNetworking
v2 великолепен;такое поведение было странность при его принятии.Моя первоначальная мысль была «Это не может быть правильно», но я думаю, что основная причина в том, что вы поощряется для создания собственных сериализаторов ответов.Поставляемые экземпляры довольно легкие.Создать свою собственную несложно, а сериализатор ответов — хорошее место для инкапсуляции логики, связанной с сетью, которая в противном случае снова окажется в вашем приложении.