TIdCompressorZLib在为Android编译的FireMonkey应用程序中不起作用

问题描述

我有一个使用TIdCompressorZLibTIdHTTP函数,如下所示:

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函数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...