我正在使用以下脚本从网站获取数据。数据已返回,但格式为gzip或某些编码格式。我尝试使用gzdecode,但无法正常运行。有什么办法可以查看此请求中的干净数据。
我使用
curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
curl_setopt($ch, CURLOPT_ENCODING , 'br');
,但是它们都不起作用。下面是curl请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, 'https://www.example.com');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
$response = curl_exec($ch);
$d = curl_getinfo( $ch );
curl_getinfo显示在下方
我可以看到该网站正在使用“ br”编码,即Content-Encoding:br
答案 0 :(得分:0)
br
编码是Brotli编码。您可以使用Accept-Encoding
在curl_setopt($ch, CURLOPT_ENCODING , 'br')
标头中传递它,但是curl
不会处理它,即,您必须显式地解码输出。
您可能可以使用以下PHP扩展名:https://github.com/kjdev/php-ext-brotli
您还可以尝试使用curl_setopt($ch, CURLOPT_ENCODING , 'identity')
,并且如果要调用的服务器运行正常,则可以将数据解压缩。
我猜您已经尝试完全省略Accept-Encoding
标头。遗憾的是,根据the specs,这不会阻止对输出进行编码。
答案 1 :(得分:0)
在标题中,我只允许gzip和deflate并删除了br,它对我有用。因此,我使用$header[] = 'Accept-Encoding: gzip, deflate, br';
$header[] = 'Accept-Encoding: gzip, deflate';
感谢大家的帮助。
答案 2 :(得分:0)
curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
curl_setopt($ch, CURLOPT_ENCODING , 'br');
后续调用将覆盖先前的值,它不会添加到先前的值。如果要支持deflate
,gzip
和br
,请用逗号分隔,例如
curl_setopt($ch, CURLOPT_ENCODING , 'gzip,deflate,br');
但是,br是curl的最新成员,br支持最初是在7.57.0版的curl中添加的,该版本于November 29 2017
发布,因此您可能要添加
if(!definied("CURL_VERSION_BROTLI")){
// https://github.com/curl/curl/blob/f762fec323f36fd7da7ad6eddfbbae940ec3229e/include/curl/curl.h#L2720
define("CURL_VERSION_BROTLI",(1<<23));
}
if(!(curl_version()["features"] & CURL_VERSION_BROTLI)){
throw new \RuntimeException("this script requires brotli support added to libcurl (added in libcurl version 7.57.0, released November 29 2017), please update your libcurl installation.");
}
如果需要,请确保php的libcurl实际上支持br。