卷曲不返回所有标题

时间:2012-06-01 04:39:32

标签: php curl http-headers

我在PHP中使用Curl来调用API

根据他们的documentation,他们在返回页面的标题中返回“Authentication-Callback”。

将URL粘贴到浏览器中时效果非常好,但Curl似乎将其删除了。

这是我的代码

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://api.themoviedb.org/3/authentication/token/new?api_key=[MY_API_KEY]&language=en');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $results = curl_exec($ch);
    $headers = curl_getinfo($ch);

这是返回的标题

Array
    (
        [url] => http://api.themoviedb.org/3/authentication/token/new?api_key=[MY_API_KEY]&language=en&
        [content_type] => application/json;charset=utf-8
        [http_code] => 200
        [header_size] => 470
        [request_size] => 137
        [filetime] => -1
        [ssl_verify_result] => 0
        [redirect_count] => 0
        [total_time] => 0.109
        [namelookup_time] => 0
        [connect_time] => 0.047
        [pretransfer_time] => 0.047
        [size_upload] => 0
        [size_download] => 116
        [speed_download] => 1064
        [speed_upload] => 0
        [download_content_length] => 116
        [upload_content_length] => 0
        [starttransfer_time] => 0.109
        [redirect_time] => 0
        [certinfo] => Array
            (
            )

    )

据我所知,一切都是对的。 Curl会完美地返回我需要的数据,而不是正确的标题。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您现在正在做的是通过curl_getinfo()获取有关标题的存储信息,该信息仅获取该页面上OPT列表中的信息。

你应该做的是返回标题,然后手动分开它:

curl_setopt($ch, CURLOPT_HEADER, 1);
// The rest of your options
$output = curl_exec($ch);

// Since the end of the header is always delimited by two newlines
$output = explode("\n\n", $output, 2);
$header = $output[0];
$content = $output[1];

这是更多的工作,但会为你提供真正的标题。

答案 1 :(得分:2)

这是我的代码,用于执行phsource建议将标头放入$ headers数组

的代码
# Extract headers from response
preg_match_all('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si', $curl_result, $header_matches);
$headers = preg_split('/\\r\\n/', str_replace("\r\n\r\n",'',array_pop($header_matches[0])));

# Convert headers into an associative array
if(is_array($headers))
{
  foreach ($headers as $header)
  {
    preg_match('#(.*?)\:\s(.*)#', $header, $header_matches);
    if(isset($header_matches[1]))
    {
      $headers[$header_matches[1]] = $header_matches[2];
      $headers['lowercase'][strtolower($header_matches[1])] = $header_matches[2];
    }
  }
}

# Remove the headers from the response body
$curl_result = preg_replace('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si','',$curl_result);

你可能想要根据需要用PHP_EOL替换\ r \ n