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

これは、ヘッダーが $headers 配列に配置されることを phsource が提案したことを行うための私のコードです

# 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 に答える