1

更新:この例に示すように、curl の代わりにfile_get_contents(または などの他のファイル操作)を使用して問題を解決しました: https://developers.google.com/chart/image/docs/post_requests。したがって、問題は、なぜ curl は正しいパラメーターを POST できないのに、ファイル操作はできるのかということです。これは本質的に、curl と...の違いを尋ねています。fopenfile_get_contents

元の問題

PHPでcurlを使用して画像をダウンロードしています。画像は、GET または POST を介してhttp://chart.googleapis.com/chartに渡されたパラメーターに従って生成された Google Image Chart ( https://developers.google.com/chart/image/ )です。チャートの例を次に示します。

http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World

簡単な方法は、この URL を GET することで、うまくいきます。しかし、より長い URL を取得しようとすると (グラフのデータ用のパラメータが増えます)、Google グラフは「不正な形式または不正なリクエスト」という 400 ページを返しました。ブラウザーでその長い URL を指定すると、目的のグラフが表示され、URL のパラメーターが正しいことを確認できました。

URLが長すぎるのが問題かと思い、POSTを利用しました。POST を使用してサンプル チャートを取得する方法を次に示します (完全なコードです。コピーして実行することをお勧めします)。

$postData = array(
  'chl' => 'Hello|World',
  'chs' => '250x100',
  'cht' => 'p3',
  'chd' => 't:60,40',
  'chof' => 'validate'   // turn on the debugging mode
);
$ch = curl_init('http://chart.googleapis.com/chart');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
$ret = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info["request_header"];   // check my sent header
echo $ret;   // print out received data, expected: garbled text representing a PNG
curl_close($ch);

その後、Google チャートは (この例のチャートでも) 400 ページを返し、「チャート API リクエストには有効なパラメーターが含まれていません」というメッセージが表示されました。パラメーターをまったく受信しない場合の「Chart API リクエストにはパラメーターが含まれていません」とは対照的に、「有効」という言葉がここにあることに注意してください。したがって、Google Chart はいくつかのパラメーターを受け取ったに違いありませんが、それらを認識できないだけです。

4

0 に答える 0