【问题标题】:AFNetworking fails to resume downloads when "Content-Encoding: gzip" is set设置“内容编码:gzip”时,AFNetworking 无法恢复下载
【发布时间】:2014-07-04 18:23:48
【问题描述】:

我正在使用 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

内容编码:gzip

最后修改时间:格林威治标准时间 2014 年 5 月 16 日星期五 04:44:51

ETag:“88bbe0b318bf11dd56a31176d3384e78”

接受范围:字节

内容类型: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"];

【问题讨论】:

    标签: ios objective-c http-headers gzip afnetworking-2


    【解决方案1】:

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

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

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

    【讨论】:

    • 还可以查看 Charles Proxy,它非常好用(仅限 HTTP)
    【解决方案2】:

    好的,不知道你打算如何下载这个,或者你的目的是什么。因此,我假设您使用的是 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];
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多