首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP cURL不返回Content-Encoding头

PHP cURL不返回Content-Encoding头
EN

Stack Overflow用户
提问于 2012-10-09 12:39:54
回答 2查看 4.3K关注 0票数 1

当我在我的终端上运行curl -I http://api.stackoverflow.com/1.1/badges时,它显示了以下标头:

代码语言:javascript
复制
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 42804
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
X-AspNetMvc-Version: 4.0
X-RateLimit-Max: 300
X-RateLimit-Current: 297
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXBrowserOverride=; expires=Mon, 08-Oct-2012 04:29:28 GMT; path=/
Date: Tue, 09 Oct 2012 04:29:27 GMT

然而,当我通过PHP运行相同的cURL请求时,我得到如下结果:

代码语言:javascript
复制
Array
(
    [url] => http://api.stackoverflow.com/1.1/badges?10102
    [content_type] => application/json; charset=utf-8
    [http_code] => 200
    [header_size] => 277
    [request_size] => 85
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.168343
    [namelookup_time] => 0.023417
    [connect_time] => 0.046293
    [pretransfer_time] => 0.046365
    [size_upload] => 0
    [size_download] => 42804
    [speed_download] => 254266
    [speed_upload] => 0
    [download_content_length] => 42804
    [upload_content_length] => 0
    [starttransfer_time] => 0.097563
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => 
)

对我来说最重要的区别是,当通过PHP运行时,我不会得到Content-Encoding头,如果没有它,我不知道内容是否需要进行gzip膨胀。

有没有一种方法可以获得Content-Encoding头文件,或者用其他方法检查gzip压缩?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-09 13:56:07

返回的getinfo数组中既没有header_response也没有accept-encoding。我以为getinfo上的CURLINFO_HEADER_OUT会给出响应报头,但只给出了请求报头。

但是您可以使用设置为true的CURLOPT_HEADER选项来获取原始标头。所以我建议你做一些不那么自然的事情:

代码语言:javascript
复制
$curl = curl_init();

$opts = array (
        CURLOPT_URL => 'http://api.stackoverflow.com/1.1/badges',
        CURLOPT_TIMEOUT => 120,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_ENCODING => 'gzip',
        CURLOPT_HEADER => true,
);
curl_setopt_array($curl, $opts);

$return = curl_exec($curl);

list($rawHeader, $response) = explode("\r\n\r\n", $return, 2);

$cutHeaders = explode("\r\n", $rawHeader);
$headers = array();
foreach ($cutHeaders as $row)
{
    $cutRow = explode(":", $row, 2);
    $headers[$cutRow[0]] = trim($cutRow[1]);
}

echo $headers['Content-Encoding']; // gzip
票数 5
EN

Stack Overflow用户

发布于 2012-10-09 13:32:34

如果将CURLOPT_HEADER设置为true,curl将返回正文旁边的头部。如果只对头部感兴趣,可以将CURLOPT_NOBODY设置为true,并且不返回正文(这模拟命令行上的-I标志)。

此示例仅设置CURLOPT_HEADER,读取Content-Encoding标头(如果已设置)并解压缩正文:

代码语言:javascript
复制
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "http://api.stackoverflow.com/1.1/badges");
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curl);
curl_close($curl);

list($header, $body) = explode("\r\n\r\n", $response, 2);
if(preg_match('@Content-Encoding:\s+(\w+)@i', $header, $match)) {
    switch (strtolower($match[1])) {
        case 'gzip':
            $body = gzdecode($body);
        break;

        case 'compress':
            $body = gzuncompress($body);
        break;

        case 'deflate':
            $body = gzdeflate($body);
        break;
    }
}
echo $header;
echo $body;

免责声明:gzdecode可能在您的PHP版本中不可用。我用PHP 5.4.4对它进行了测试,它可以正常工作。

您还可以安装HTTP_Request2-PEAR包,它将为您完成此操作(另外,您无需解析HTTP头即可轻松访问头文件):

代码语言:javascript
复制
include 'HTTP/Request2.php';
$request  = new HTTP_Request2('http://api.stackoverflow.com/1.1/badges',
    HTTP_Request2::METHOD_GET);

$response = $request->send();

echo $response->getBody();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12792910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档