看完之后 使用 AFNetworking 2.0 的 POST 请求 - 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 + requests 进行相同的调用时,我得到:

{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 v2 — 默认情况下,响应正文不会传递到失败块中。 详情请查看 Github 上的讨论.

最底线是你需要子类化 AFJSONResponseSerializer 为了将您需要的响应数据添加到 userInfo 字典的 NSError 期间 responseObjectForResponse:data:error:. 。(然后您就可以访问它。)

你的问题促使我重新审视 Github问题(同上). 。现在有 一篇博文带有示例子类的存储库 可用的。

我希望这一切有帮助。

AFNetworking v2 很棒;这种行为是 一个奇怪的现象 当采用它时。我最初的想法是 “这不可能是正确的”, ,但我认为根本原因是你是 鼓励 创建您自己的响应序列化器。提供的示例相当轻量。您可以轻松创建自己的响应序列化器,并且响应序列化器是封装网络相关逻辑的好地方,否则这些逻辑最终会返回到您的应用程序中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top