كيف ترى خطأ 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
الإصدار 2 — بشكل افتراضي، لا يتم تمرير نص الاستجابة إلى كتلة الفشل. تحقق من المناقشة على جيثب للحصول على التفاصيل.
خلاصة القول هي أنك بحاجة إلى فئة فرعية AFJSONResponseSerializer
من أجل إضافة بيانات الاستجابة التي تحتاجها إلى userInfo
قاموس NSError
خلال responseObjectForResponse:data:error:
.(ستتمكن بعد ذلك من الوصول إليه.)
سؤالك دفعني لإعادة النظر في الموضوع مشكلة جيثب (نفس ما ورد أعلاه).هناك الآن مشاركة مدونة و الريبو مع مثال فئة فرعية متاح.
آمل أن كل ما يساعد.
AFNetworking
الإصدار 2 رائع؛كان هذا السلوك شذوذ عند اعتماده.كان تفكيري الأولي "هذا لا يمكن أن يكون صحيحا", ، لكنني أعتقد أن السبب الأساسي هو أنك كذلك شجعت لإنشاء تسلسلات الاستجابة الخاصة بك.الأمثلة التي يتم شحنها خفيفة الوزن إلى حد ما.من السهل إنشاء منطقك الخاص، ويُعد مُسلسِل الاستجابة مكانًا جيدًا لتغليف المنطق المرتبط بالشبكة والذي سينتهي به الأمر مرة أخرى في تطبيقك.