带有 gzip 编码的 NSMutableURLRequest 不起作用

NSMutableURLRequest with gzip encoding not working

我似乎无法让 NSUrlRequest 使用压缩的服务器响应...

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"localhost:12345/content"]];

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json"  forHTTPHeaderField:@"Content-Type"];
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response,
                                           NSData *data,
                                           NSError *connectionError) {
                           NSLog(@"data size: %i", [data length]);
                         }];

==> 数据大小:226854

如您所见,如果我做一个没有 Accept-encoding header 的卷曲,我得到相同的尺寸:

% curl -s -w \%{size_download} -o /dev/null  -H "Content-Type: application/json" -H "Accept: application/json" localhost:12345/content

226854

然而,使用 gzip 的 header,我得到:

% curl -s -w \%{size_download} -o /dev/null -H "Content-Type: application/json" -H "Accept: application/json" -H "Accept-Encoding: gzip" localhost:12345/content

86304

我做错了什么?如何让我的 iOS 应用程序正确使用 gzip header?

传给你的completion handler的NSData是解压后的数据,所以你自然会看到更大的尺寸。

gzip 编码用于传输,然后 NSURLConnection 解压缩并提供数据;压缩后的数据对您没有多大用处,因为您只需要自己解压缩即可。 gzip 编码的要点是它对您的应用程序是透明的,但可以减少网络流量。

无法使用 NSURLConnection 查看压缩数据。

您可以使用 Wireshark 等网络捕获工具来捕获传输并验证是否使用了 gzip 编码。