如何使用 AFNetworking 查看 json POST 的错误?

Posted

技术标签:

【中文标题】如何使用 AFNetworking 查看 json POST 的错误?【英文标题】:How see the error of a json POST with AFNetworking? 【发布时间】:2014-01-11 02:21:53 【问题描述】:

查看POST request with 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 + 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 之一。我需要解决什么问题?

【问题讨论】:

【参考方案1】:

您遇到了AFNetworking v2 的怪癖 — 默认情况下,响应正文不会传递到失败块中。 Check the discussion on Github for the details.

底线是您需要子类化AFJSONResponseSerializer,以便在responseObjectForResponse:data:error: 期间将所需的响应数据添加到NSErroruserInfo 字典中。 (然后您就可以访问它了。)

您的问题促使我重新访问Github issue (same as above)。现在有a blog post 和a repo with an example subclass 可用。

我希望这一切都会有所帮助。

AFNetworking v2 很棒;这种行为在采用时是奇怪的。我最初的想法是“这不可能”,但我认为根本原因是鼓励您创建自己的响应序列化程序。随附的示例相当轻量级。创建您自己的很容易,并且响应序列化器是封装网络相关逻辑的好地方,否则最终会回到您的应用程序中。

【讨论】:

这成功了,但是正文返回一个 NSString 而不是 JSON/Dictionary... 你会得到一个 NSData。如果你有一个字符串,你可以自己在某个地方转换它。如果你想要一个 NSDictionary,你可以在那里使用 NSJSONSerialization。

以上是关于如何使用 AFNetworking 查看 json POST 的错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetworking 在 http 中将 json 数据作为参数传递

如何使用 JSON 格式解析通过 AFNetworking 1.0 获得的响应

如何使用 AFNetworking-2.0 执行 JSON 编码的 GET 请求?

AFNetworking/Overcoat/Promisekit - 在错误消息中获取返回 json

如何使用 AFNetworking 在 Http 请求中发送 json 数据

如何在 iOS Objective-C 中使用 AFNetworking 库下载 .json 文件?