我在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会完美地返回我需要的数据,而不是正确的标题。
感谢任何帮助!
答案 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