Вопрос

После просмотра 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 великолепен;такое поведение было странность при его принятии.Моя первоначальная мысль была «Это не может быть правильно», но я думаю, что основная причина в том, что вы поощряется для создания собственных сериализаторов ответов.Поставляемые экземпляры довольно легкие.Создать свою собственную несложно, а сериализатор ответов — хорошее место для инкапсуляции логики, связанной с сетью, которая в противном случае снова окажется в вашем приложении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top