Frage

Nach dem Anschauen POST-Anfrage mit AFNetworking 2.0 - AFHTTPSessionManager Ich kann nicht sehen, wo die Fehlermeldung zu finden ist.

Das ist mein Setup:

-(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);
               }];
}

Ich rufe an http://www.django-rest-framework.org/api-guide/authentication#tokenauthentication, direkt die rest_framework.authtoken.views.obtain_auth_token die nach einem Benutzernamen und Passwort fragen und ein Token zurückgeben.

Wenn der Benutzer / Pass korrekt ist, funktioniert dies einwandfrei.Aber wenn nicht, bekomme ich:

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";
} }

Wenn ich jedoch den gleichen Anruf mit Python + Anfragen mache, bekomme ich:

{u'non_field_errors': [u'Unable to login with provided credentials.']}

Aber ich finde es nicht in der NSError.

Auch, trotzdem habe ich gesetzt responseSerializer, es berichtet in der Aufgabe:

(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";

Anstelle des JSon.Was muss ich reparieren?

War es hilfreich?

Lösung

Du hast einen getroffen Macke von AFNetworking v2 - Standardmäßig wird der Antworttext nicht an den Fehlerblock übergeben. Überprüfen Sie die Diskussion auf Github für die Details.

Die Quintessenz ist, dass Sie eine Unterklasse erstellen müssen AFJSONResponseSerializer um die Antwortdaten hinzuzufügen, die Sie benötigen, um die userInfo wörterbuch der NSError während responseObjectForResponse:data:error:.(Sie können dann darauf zugreifen.)

Ihre Frage hat mich dazu veranlasst, die Github-Problem (wie oben).Es gibt jetzt Blogposten und ein Repo mit einer Beispielunterklasse verfügbar.

Ich hoffe, das alles hilft.

AFNetworking v2 ist großartig;dieses Verhalten war Kuriosität bei der Annahme.Mein erster Gedanke war "Das kann nicht richtig sein", aber ich denke, der zugrunde liegende Grund ist, dass Sie sind ermutigt um Ihre eigenen Antwortserialisierer zu erstellen.Die ausgelieferten Beispiele sind ziemlich leicht.Es ist einfach, eigene zu erstellen, und der Antwortserialisierer ist ein guter Ort, um netzwerkbezogene Logik zu kapseln, die sonst wieder in Ihrer Anwendung landet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top