我尝试使用TIdHTTP
和TIdCompressorZLib
获取启用了gzip压缩的页面。
在Windows上,代码工作正常,数据解压缩。但OSX上完全相同的代码返回的垃圾数据看起来仍然是压缩的。我无法真正看出它出了什么问题?
这是我测试的代码:
with TIdHTTP.Create(nil) do begin
HandleRedirects := true;
Compressor := TIdCompressorZLib.Create(nil);
Request.AcceptEncoding := 'gzip, deflate';
Data := Get('http://google.com.au');
Compressor.Free;
Free;
WriteLn(Data);
end;
Data
看起来像OSX上的原始压缩垃圾,而它是Windows上的普通解压缩HTML。
我正在使用Delphi 10.1 Berlin Update 1和OSX 10.11。
答案 0 :(得分:1)
您手动设置TIdHTTP.Request.AcceptEncoding
属性,告诉网络服务器发送压缩响应即使TIdCompressorZLib
实际上尚未准备好处理也可以它即可。在您的情况下,TIdCompressorZLib.IsReady
属性可能在OSX上报告为False,在Windows上报告为True。
2016年1月,Indy更新为在第一次使用ZLib时按需动态加载ZLib库(SVN rev 5330)。这一变化打破了TIdCompressorZLib
,后来于2016年2月修订(SVN rev 5343)。我不知道这个修复是否在柏林。尝试安装最新的SVN rev并查看问题是否仍然存在(instructions和download)。
使用TIdHTTP.Compressor
属性时,不要手动设置Request.AcceptEncoding
属性:
with TIdHTTP.Create(nil) do begin
HandleRedirects := true;
Compressor := TIdCompressorZLib.Create(nil);
// Request.AcceptEncoding := 'gzip, deflate'; // <-- here
Data := Get('http://google.com.au');
Compressor.Free;
Free;
WriteLn(Data);
end;
将Request.AcceptEncoding
留空,如果指定的TIdHTTP
实际上已准备好处理压缩响应,请让Compressor
在内部更新。
顺便说一句,如果TIdHTTP
在失败时引发异常,则会泄露TIdCompressorZLib
和TIdHTTP.Get()
个对象。您应该使用try/finally
块:
with TIdHTTP.Create(nil) do
try
HandleRedirects := true;
Compressor := TIdCompressorZLib.Create(nil);
try
// Request.AcceptEncoding := 'gzip, deflate';
Data := Get('http://google.com.au');
finally
Compressor.Free;
end;
finally
Free;
end;
WriteLn(Data);