2013-07-29 97 views
1

我试图在Rackspace云服务上执行身份验证。基本上这涉及到发送一个JSON字符串到https://identity.api.rackspacecloud.com/v2.0/tokens,然后在响应中接收到一个JSON结果。SSL POST通过CURL命令行脚本失败,但成功从PHP脚本

但是,我遇到了这个问题,即它在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不是?!谢谢!

P.S.我正在使用Windows 7个人电脑。

编辑

,当我把JSON字符串,并把它放在一个文件,然后它也可以做到这一点:

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

回答

1

我只是决定尝试一些我不认为需要解决我的问题的方法,事实证明这是解决方案。

以下工作:

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的问题!

+1

好听!这是我的Mac与你的确切例子,所以我很高兴你明白了。 –

+0

@凯尔谢谢。我早些时候联系了Rackspace支持团队,而我所使用的人员使用的是Mac,无法复制此问题。干杯。 –

0

我的建议是:经过您在设置的所有选项php脚本并找到相应的命令行选项(例如通过man页面)。然后再次尝试该命令。

+0

看着这个,不知道还有什么要补充的。我看起来好像与CURL解析JSON字符串的方式有关。 –

相关问题