设置“Content-Encoding:gzip”时,AFNetworking无法恢复下载

我正在使用AFNetworking2从我的AWS S3存储桶下载文件一切正常,除非我为文件设置了Content-Encoding:gzip。 AFNetworking无法下载从服务器返回的部分内容响应,它给出了以下错误:

错误域= NSURLErrorDomain代码= -1015“无法解码原始数据”UserInfo = 0x10d2d8ce0 {NSUnderlyingError = 0x10d1ace80“无法解码原始数据”,NSErrorFailingURLStringKey = http://s3.amazonaws.com/awdtest/fullzip.pdf,NSErrorFailingURLKey = http: //s3.amazonaws.com/awdtest/fullzip.pdf,NSLocalizedDescription =无法解码原始数据}

但是,当我从我的文件中删除“Content-Encoding:gzip”元数据时,它工作正常。 我知道我的服务器支持范围请求,我已经使用其他方法对其进行了测试,并且工作正常。

这是我服务器的HTTP响应:

HTTP / 1.1 200好的

x-amz-id-2:k5b65TtAgrD5Cn3N2aixCCdi6qAmg4j9iuOSNaO0uMRKLHPTQ + DMaA20u9j1CNzA

x-amz-request-id:7AE5A7DD81ED2B88

日期:2014年5月16日星期五04:45:17 GMT

内容编码:gzip

Last-Modified:星期五,2014年5月16日04:44:51 GMT

ETag:“88bbe0b318bf11dd56a31176d3384e78”

Accept-Ranges:字节

内容类型:application / pdf

内容长度:1243325

服务器:AmazonS3

以下是我正在使用的示例文件:

https://s3.amazonaws.com/awdtest/full.pdf

https://s3.amazonaws.com/awdtest/fullzip.pdf(gzip并将Content-Encoding设置为gip)

如果有人可以帮我解决这个问题,我将不胜感激。

PS:我已经尝试了以下内容但仍然无效

[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; [request setValue:@"deflate" forHTTPHeaderField:@"Accept-Encoding"]; [request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; 

使用Wireshark查看收到的http正文。

它可能是您使用的responseSerializer无法解析原始数据。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

好的,不确定你是如何下载这个,或者你的目的是什么。 所以,我假设您正在使用iOS 7 API,特别是AFHTTPSessionManager,并且您正在使用该文件的原始数据。 鉴于此,我编写了一个使用的数据序列化器,然后实际的代码很短:

串行器(有点奇怪):

 @interface FFDataResponseSerializer : AFHTTPResponseSerializer @end @implementation FFDataResponseSerializer - (instancetype)init { self = [super init]; if (!self) { return nil; } self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/pdf", nil]; return self; } - (id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error { if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { return nil; } return data; } @end 

然后,在我的代码中:

 NSURLSessionConfiguration *aURLSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; aURLSessionConfiguration.HTTPAdditionalHeaders = @{@"Accept-Encoding": @"gzip, deflate", @"Accept": @"application/pdf"}; AFHTTPSessionManager *urlManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:aURLSessionConfiguration]; urlManager.responseSerializer = [FFDataResponseSerializer serializer]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/awdtest/fullzip.pdf"]]; NSURLSessionDataTask *dataTask = [urlManager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"error: %@", error); } else { NSLog(@"response: %@, responseObject: %@", response, responseObject); // responseObject is your NSData Object with the PDF data inside of it. } }]; [dataTask resume]; 

你显然想要处理错误,保留你想要重用的变量等等……