问题描述
我有一个使用TIdCompressorZLib
和TIdHTTP
的函数,如下所示:
pegar := tidhttp.create(nil);
compressor := TIdCompressorZLib.create(pegar);
seguro := TIdSSLIOHandlerSocketopenSSL.create(pegar);
pegar.compressor := compressor;
pegar.Request.UserAgent := UserAgent;
pegar.Request.Accept := '*/*';
pegar.Request.AcceptEncoding := 'gzip,deflate';
pegar.Request.AcceptLanguage := 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7';
pegar.HTTPOptions := [hoForceEncodeParams];
pegar.ReadTimeout := 60000;
pegar.ConnectTimeout := 60000;
pegar.HandleRedirects := true;
pegar.IOHandler := seguro;
pegar.CookieManager := cookm;
pagina := pegar.Get(proxima_pagina);
在为Windows而不是Android编译时,此代码可以正常工作。在Android上,TIdCompressorZLib
不会解压缩源,返回不可读的字符。
有什么办法可以解决这个问题?我正在使用Delphi 10.3。
解决方法
摆脱AcceptEncoding
属性的分配。让TIdHTTP
根据Compressor
的实际功能为您内部处理。即使Compressor
无法处理压缩响应(即,Compressor.IsReady
为False),您也已明确授予HTTP服务器发送压缩响应的权限。
也就是说,Indy使用动态加载库在非Windows平台上访问ZLib。在这种情况下,'Nix平台上的libz
dylib(Android运行在Linux之上)可能不在您的Android项目中。如果Indy在运行时无法加载ZLib库,则Compressor.IsReady
返回False。因此,请确保您的部署中存在dylib。如果您需要在运行时指定该文件的位置,则Indy在IdZLibSetLibPath()
单元中具有IdZLibHeaders
函数。