我正在尝试在Rackspace云服务上执行身份验证。基本上这涉及将JSON字符串POST到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"}}
作为回复。我应该指出,根据Rackpace Cloud凭据,<my_username>
和<my_apikey>
是我的用户名和API密钥。
但是当我在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 PC。
修改
当我获取JSON字符串并将其放入文件然后执行此操作时,它也可以工作:
curl -s https://identity.api.rackspacecloud.com/v2.0/tokens -X POST -d @myfile.json -H "Content-Type: application/json"
答案 0 :(得分: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 :(得分:0)
我的建议:浏览您在php脚本中设置的所有选项,并找到相应的命令行选项(例如,通过man
页面)。然后再次尝试该命令。