【问题标题】:AFNetworking 2.0 Get JSON from code 400 in failure blockAFNetworking 2.0 从故障块中的代码 400 获取 JSON
【发布时间】:2013-10-26 15:56:42
【问题描述】:

我正在使用 AFHTTPRequestOperationManager 发送 POST 请求。现在我故意输入错误信息来处理400 错误代码。现在,Web 服务实际上返回了一个JSON,其中包含一条向用户解释他们做错了什么的消息。我非常想让这个JSONUIAlertView 中显示消息。但是,故障块:

[operationManager POST:ServerURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: Status Code: %d", operation.response.statusCode);
}
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"Failed: Status Code: %d", operation.response.statusCode);
 }];

不会像成功块中的那样传递 responseObject。那么有谁知道我如何访问带有 400 错误的 Web 服务返回的 JSON? NSError *error 只是给了我Request failed: bad request (400) 而不是返回的 JSON。

任何帮助将不胜感激,
迈克

【问题讨论】:

标签: ios iphone objective-c afnetworking afnetworking-2


【解决方案1】:

查看- responseObject 的代码,HTTP 错误似乎阻止了它被填充。您可以直接获取responseData 并自己解析它,但我会说这要么是一个错误,要么是一个很好的增强请求。 (看起来- responseObject 在决定是否应该尝试构建响应对象时可能应该检查self.responseSerializationError,而不是self.error。)

【讨论】:

  • 嘿,杰西,非常感谢您的出色回答,非常详细。我现在可能会窥探自己,看看我能不能做出一点改变,但我们会拭目以待。
  • 有什么办法可以在 json 中返回服务器响应。还没!
  • 您可能已经解决了这个问题,但是您可以从失败块中的 AFHTTPRequestOperation 对象中获取 responseObject
  • @tbag 问题是失败块中responseObject为nil。
  • Github 上有很多关于这个的问题,但是 Matt 说这会破坏 API 设计
【解决方案2】:

你可以做这些解决方案中的任何一个

1) 设置acceptableStatusCodes 接受你的400 statusCode,然后你在成功块中处理

manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];

2) 创建一个自定义的ResponseSerializer,像JSONResponseSerializerWithData,将responseObject插入到NSError userInfo中,并在失败块中处理

专业提示:AFNetworking 是开源的,只需查看 AFHTTPRequestOperation 的方法即可

setCompletionBlockWithSuccess:failure:

responseObject

error

【讨论】:

    【解决方案3】:

    我在 AFNetworking 中也遇到了同样的问题,而不是使用

    - (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                      progress:(void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                       failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
    

    请尝试使用那个:-

    - (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                      progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
    

    谢谢,

    【讨论】:

      【解决方案4】:

      以下为我编写的代码:

      AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
          manager.responseSerializer = [AFJSONResponseSerializer serializer];
          manager.requestSerializer = [AFJSONRequestSerializer serializer];
      
          [manager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
          [manager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
          [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
          manager.securityPolicy.allowInvalidCertificates = YES;
      
          NSString *URLString = [NSString stringWithFormat:@"%@/%@", BASE_URL,methodName];
      
      
      
          [manager POST:URLString parameters:requestDict success:^(AFHTTPRequestOperation *operation, id responseObject)
          {
              NSLog(@"JSON: %@", responseObject);
      
              [myDelegate StopIndicator];
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"Error: %@", error);
              [myDelegate StopIndicator];
          }];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多