PHP cURL不返回Content-Encoding标头

xbo*_*nez 1 php curl

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

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
Run Code Online (Sandbox Code Playgroud)

但是,当我通过PHP运行相同的cURL请求时,我得到了:

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] => 
)
Run Code Online (Sandbox Code Playgroud)

对我而言,主要的区别在于,通过PHP运行时,我没有获取Content-Encoding标头,没有该标头,我不知道是否需要将内容压缩为gzip。

有没有一种方法可以获取Content-Encoding标头,或以其他方式检查gzip压缩?

Ala*_*blo 5

没有header_response,也没有accept-encoding返回的是getinfo阵列。我以为CURLINFO_HEADER_OUT在getinfo上会给出响应头,但是只给出请求头。

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

$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
Run Code Online (Sandbox Code Playgroud)