SSL POST从CURL命令行脚本失败,但从PHP脚本成功


SSL POST fails from CURL Command Line Script but succeeds from PHP Script

我正在尝试对Rackspace云服务执行身份验证。基本上,这涉及到将JSON字符串张贴到https://identity.api.rackspacecloud.com/v2.0/tokens然后在响应中接收JSON结果。

然而,我对此有问题,即它在PHP中有效,但当我从命令行使用CURL时它不起作用。

当我在命令行中这样做时:

curl -s https://identity.api.rackspacecloud.com/v2.0/tokens -X POST -d '{"auth":{"RAX-KSKEY:apiKeyCredentials":{"username":"<my_username>", "apiKey":"<my_apikey>"}}}' -H "Content-Type: application/json"

它不起作用,即我收到{"badRequest":{"code":400,"message":"JSON Parsing error"}}作为响应。我应该指出,<my_username><my_apikey>是我的用户名和api密钥,根据Rackpace Cloud Credentials。

但是当我在PHP代码中执行以下操作时:

$post_data = '{"auth":{"RAX-KSKEY:apiKeyCredentials":{"username":"<my_username>", "apiKey":"<my_apikey>"}}}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://identity.api.rackspacecloud.com/v2.0/tokens');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($post_data))
);
$result = curl_exec($ch);

它起作用了,我可以像预期的那样获得JSON数据

我想知道为什么PHP可以工作,但命令行上的CURL不可以?!谢谢

第页。S.我用的是Windows7电脑。

编辑

当我获取JSON字符串并将其放入文件中,然后执行以下操作时,它也会起作用:

curl -s https://identity.api.rackspacecloud.com/v2.0/tokens -X POST -d @myfile.json -H "Content-Type: application/json"

我刚刚决定尝试一些我拒绝相信需要做的事情来解决我的问题,结果证明这就是解决方案。

以下工作:

curl -s https://identity.api.rackspacecloud.com/v2.0/tokens -X POST -d "{'"auth'":{'"RAX-KSKEY:apiKeyCredentials'":{'"username'":'"<my_username>'", '"apiKey'":'"<my_apikey>'"}}}" -H "Content-Type: application/json"

微妙的区别,即我使用双引号来封装JSON字符串(而不是单引号),然后转义JSON字符串中的双引号。

这可能是Windows独有的问题!

我的建议:浏览php脚本中设置的所有选项,并找到相应的命令行选项(例如通过man页面)。然后重试该命令。