更新:我已经通过使用file_get_contents
(或其他文件操作,例如fopen
)而不是 curl 来解决问题,如本示例所示:https ://developers.google.com/chart/image/docs/post_requests 。因此,问题是,为什么 curl 不能 POST 正确的参数而文件操作可以呢?这本质上是在询问 curl 和file_get_contents
...
原来的问题
我在 PHP 中使用 curl 来下载图像。该图像是根据通过 GET 或 POST 传递到http://chart.googleapis.com/chart的参数生成的 Google 图像图表 ( https://developers.google.com/chart/image/ ) 。这是一个示例图表:
http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World
简单的方法是获取这个 URL,它可以工作。但是,当我尝试获取更长的 URL(图表数据具有更多参数)时,Google Chart 返回了一个 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);
然后谷歌图表返回(即使对于这个示例图表)一个 400 页面说“图表 API 请求不包含有效参数”。请注意这里的“有效”一词,与根本没有接收到任何参数时的“图表 API 请求不包含参数”形成对比。因此,谷歌图表一定收到了一些参数,但它无法识别它们。