AFNetworking 无法序列化压缩响应(响应对象为零)

Posted

技术标签:

【中文标题】AFNetworking 无法序列化压缩响应(响应对象为零)【英文标题】:AFNetworking unable to serialize gzipped response (response object is nil) 【发布时间】:2015-05-26 08:31:10 【问题描述】:

我正在使用 AFNetworking 下载一个 .gzip 文件,该文件在未压缩时应返回一个 JSON 字符串。我通过浏览器发出了 get 请求,下载了 .gzip 文件,解压缩后会检索到相应的 JSON。

我知道 AFNetworking 是建立在 NSURLConnection 之上的,从我读到的 NSURLConnection 中内置了 gzip 膨胀。但是,我无法将服务器返回的 gzip 文件解压缩并解析为 JSON。来自 AFNetworking 的响应对象仍然为零。我的代码如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"application/x-gzip", nil];


[manager GET:[NSString stringWithFormat:@"%@%@", BASE_URL, GET_CONTENTS_URL] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    if(responseObject == nil)
        NSLog(@"Response is still nil");
    
    NSLog(@"JSON: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

我不确定为什么这不起作用。

注 1:但是,如果我将响应序列化程序替换为 AFHTTPResponse 序列化程序,则响应对象不是 nil。但是,它属于 _NSInlineData 类,这是一个未记录的类。

【问题讨论】:

我也有同样的问题。如果我能找到解决方案,会发布任何内容。 【参考方案1】:

我遇到了同样的问题,终于在 AFgzipRequestSerializer 的帮助下得到了工作。

您需要使用“AFgzipRequestSerializer”。

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFgzipRequestSerializer  serializerWithSerializer:[AFJSONRequestSerializer serializer]];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

manager.responseSerializer = [AFHTTPResponseSerializer 序列化器];

【讨论】:

【参考方案2】:

在我的例子中,我使用了AFHTTPSessionManager,它在不使用AFgzipRequestSerializer 来解码响应的情况下运行良好。

【讨论】:

以上是关于AFNetworking 无法序列化压缩响应(响应对象为零)的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 和响应序列化选项

无法保存 AFNetworking 响应对象

AFNetworking:无法从 AFHTTPRequestOperation 获取响应字符串

无法理解使用 AFNetworking 在服务器中发布数据的响应

无法使用 AFNetworking 3 为 JSON 和 XML 响应创建单例

使用 AFNetworking 解析布尔响应