Wie sehe ich den Fehler eines JSON-POSTS mit AFNetworking?
-
22-12-2019 - |
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?
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.