سؤال

بعد النظر طلب 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 رائع؛كان هذا السلوك شذوذ عند اعتماده.كان تفكيري الأولي "هذا لا يمكن أن يكون صحيحا", ، لكنني أعتقد أن السبب الأساسي هو أنك كذلك شجعت لإنشاء تسلسلات الاستجابة الخاصة بك.الأمثلة التي يتم شحنها خفيفة الوزن إلى حد ما.من السهل إنشاء منطقك الخاص، ويُعد مُسلسِل الاستجابة مكانًا جيدًا لتغليف المنطق المرتبط بالشبكة والذي سينتهي به الأمر مرة أخرى في تطبيقك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top