【问题标题】:how to get raw JSON response from AFnetworking 2.0 operation / NSURLSessioNDataTask?如何从 AFnetworking 2.0 操作/NSURLSessioNDataTask 获取原始 JSON 响应?
【发布时间】:2014-06-13 00:41:39
【问题描述】:

这是我的代码..这是一个非常简单的操作

[self GET:operationName parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
          NSLog(@"%@", responseObject);
          //do something upon success
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
         //do something to handle error
    }];

我的问题是,我需要查看确切的原始 json 响应是什么。当我 NSLog 响应对象时,它与我从独立 HTTP 客户端获得的 JSON 输出不同 _ 我猜是因为它已经通过序列化器?

【问题讨论】:

  • 你在看什么?你期待看到什么?发布一些不同 json 的示例。

标签: ios ios7 afnetworking-2


【解决方案1】:

如果您不希望它将NSJSONSerialization 转换为NSArray/NSDictionary,而是想要原始的NSData,则应将AFURLSessionManager 的responseSerializer 设置为@ 987654327@。

self.responseSerializer = [AFHTTPResponseSerializer serializer];

默认值为AFJSONResponseSerializer。如果您不希望它为您转换 JSON,请更改响应序列化程序。

【讨论】:

    【解决方案2】:

    您可以使用“AFNetworkingOperationFailingURLResponseDataErrorKey”键直接从 AFNetworking 访问“数据”对象,因此无需对 AFJSONResponseSerializer 进行子类化。您可以将数据序列化为可读的字典。 这是一些示例代码:

     NSData *errorData = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
     NSDictionary *serializedData = [NSJSONSerialization JSONObjectWithData: errorData options:kNilOptions error:nil];
    

    【讨论】:

      【解决方案3】:

      使用他们的 API 很难挂钩来自 AF 的原始响应,而且他们的 logger 即使在调试级别上也会在输出到控制台之前反序列化 JSON。

      我在 AFURLSessionManager.m 文件中添加了以下行。

      NSLog(@"Response String: %@", [[NSString alloc] initWithData:[NSData dataWithData:self.mutableData] encoding:NSUTF8StringEncoding]);
      

      在这个 NSURLSessionTaskDelegate 委托方法中

      - (void)URLSession:(__unused NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
      

      这里是上下文(对于成功的响应,没有错误)

      {
      #pragma clang diagnostic push
      #pragma clang diagnostic ignored "-Wgnu"
      __strong AFURLSessionManager *manager = self.manager;
      
      __block id responseObject = nil;
      
      __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
      userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer;
      
      if (self.downloadFileURL) {
          userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL;
      } else if (self.mutableData) {
          userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = [NSData dataWithData:self.mutableData];
      }
      
      if (error) {
          userInfo[AFNetworkingTaskDidCompleteErrorKey] = error;
      
          dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
              if (self.completionHandler) {
                  self.completionHandler(task.response, responseObject, error);
              }
      
              dispatch_async(dispatch_get_main_queue(), ^{
                  [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
              });
          });
      } else {
          dispatch_async(url_session_manager_processing_queue(), ^{
              NSError *serializationError = nil;
              NSLog(@"Response String: %@", [[NSString alloc] initWithData:[NSData dataWithData:self.mutableData] encoding:NSUTF8StringEncoding]);
              responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:[NSData dataWithData:self.mutableData] error:&serializationError];
      
              if (self.downloadFileURL) {
                  responseObject = self.downloadFileURL;
              }
      
              if (responseObject) {
                  userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;
              }
      
              if (serializationError) {
                  userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;
              }
      
              dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
                  if (self.completionHandler) {
                      self.completionHandler(task.response, responseObject, serializationError);
                  }
      
                  dispatch_async(dispatch_get_main_queue(), ^{
                      [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
                  });
              });
          });
      }
      #pragma clang diagnostic pop
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-02
        • 2013-10-06
        • 1970-01-01
        相关资源
        最近更新 更多