2012-10-09 87 views
1

當我運行curl -I http://api.stackoverflow.com/1.1/badges來回我的終端,它讓我看到下面的標題:PHP捲曲不返回Content-Encoding頭

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一樣捲曲的要求,我得到這個:

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壓縮?

回答

4

有一個在沒有返回header_response也不accept-encodinggetinfo數組。我認爲getinfo上的CURLINFO_HEADER_OUT會給出響應標題,但只給出請求標題。

但是,您可以使用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 
3

如果將CURLOPT_HEADER設置爲true,curl會將標題返回到正文的旁邊。如果您只是對標題感興趣,則可以將CURLOPT_NOBODY設置爲true,並且不返回正文(模擬命令行中的-I標誌)。

此示例設置只是CURLOPT_HEADER,讀取Content-Encoding頭(如果設置),並解壓縮體:​​

$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頭解析):

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();