0

我在 PHP 中使用 Curl 来调用API

根据他们的文档,他们在返回页面的标题中返回“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 返回我完全需要的数据,而不是正确的标题。

任何帮助表示赞赏!

4

2 回答 2

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];

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

于 2012-06-01T04:48:55.733 回答
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);

您可能希望将 \r\n 替换为您认为合适的 PHP_EOL

于 2012-06-01T05:00:07.037 回答