您好:我正在尝试使用curl_init进行API调用;取得了一些进展,但似乎陷入困境......
我们有一个接口(swagger),它允许我们进行curl调用并测试它的工作原理:这里是curl命令:
curl -X POST --header "Content-Type: application/x-www-form-urlencoded"
--header "Accept: application/json"
--header "Authorization: Bearer xxxxx-xxxxxx- xxxxx-xxxxxxx"
-d "username=xxxxxxxx39%40gmail.com&password=xxxx1234" "http://xxxxxxxxx-xx-xx-201-115.compute-1.amazonaws.com:xxxx/api/users"
这是我尝试在PHP代码中执行相同的调用:
$json = '{
"username": "xmanxxxxxx%40gmail.com",
"password": "xxxx1234"
}';
$gtoken='xxxxxx-xxxxxx-xxx-xxxxxxxx';
$token_string="Authorization: Bearer ".$gtoken;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'http://exx-ccc-vvv-vvvv.compute-1.amazonaws.com:xxxx/api/users', //URL to the API
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json,
CURLOPT_HEADER => true, // Instead of the "-i" flag
CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded','Accept: application/json',$token_string)
));
curl_setopt($curl,CURLOPT_RETURNTRANSFER,TRUE);
$resp = curl_exec($curl);
curl_close($curl);
我收到了回复码" 500"这让我觉得我的输入有问题。所以我想知道是否有人可以帮助解决这个问题......
答案 0 :(得分:2)
在命令行代码中,使用-d "username=xxxxxxxx39%40gmail.com&password=xxxx1234"
发布标准URL编码数据字符串,但在PHP中,您创建了一个JSON字符串并将其作为单个帖子字段发送(未正确进行URL编码)。
我认为这就是你所需要的:
$data = array(
'username' => 'xmanxxxxxx@gmail.com',
'password' => 'xxxx1234',
);
$data = http_build_query($data); // convert array to urlencoded string
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
据我所知,其余的代码看起来很好。
此外,您没有明确需要设置Content-Type
标头,当您将字符串传递给CURLOPT_POSTFIELDS
时,cURL会为您执行此操作。如果将数组传递给multipart/form-data
,它会将其设置为CURLOPT_POSTFIELDS
。但拥有它也不会伤害任何东西。