如何从 AFnetworking 2.0 操作/NSURLSessioNDataTask 获取原始 JSON 响应?
Posted
技术标签:
【中文标题】如何从 AFnetworking 2.0 操作/NSURLSessioNDataTask 获取原始 JSON 响应?【英文标题】:how to get raw JSON response from AFnetworking 2.0 operation / NSURLSessioNDataTask? 【发布时间】: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 的示例。 【参考方案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
【讨论】:
以上是关于如何从 AFnetworking 2.0 操作/NSURLSessioNDataTask 获取原始 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 - 如何从子类 AFHTTPSessionManager 成功将响应传递给另一个类
如何使用 AFNetworking 2.0 将包含字典的数组发送到服务器?