質問

AFNetWorking 2.0 - AFHTTPSessionManager iエラーメッセージが見つから可能な場所がわかりません。

これは私の設定です:

-(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 /認証#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 1の代わりに。修正する必要があるの?

役に立ちましたか?

解決

AFNetworking v2の quirk を押す - デフォルトでは、応答本体は障害ブロックに渡されません。 詳細については、GitHubのディスカッションを確認してください。

下線は、AFJSONResponseSerializerの間にuserInfoNSError辞書に必要な応答データを追加するために、responseObjectForResponse:data:error:をサブクラス化する必要があります。 (あなたはそれにアクセスできることです。)

あなたの質問 GitHub問題(上記と同じ)ブログ投稿例のサブクラスを持つレポ。

私はそれを助けてくれることを願っています。

AFNetworking V2は素晴らしいです。この動作は、採用時の奇妙さでした。私の最初の思考は「これは正しいことがない」でしたが、私は根本的な推論はあなたがあなた自身の応答シリアライザを作成するためにがであることです。出荷された例はかなり軽量です。それはあなた自身のものを創造するのは簡単で、応答シリアライザはネットワーク関連ロジックをあなたのアプリケーションに戻って終わるネットワーク関連ロジックをカプセル化するのに良い場所です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top