cURL对我来说是新的。我正在尝试通过PHP cURL集成api。我试图访问的api要求参数作为键值对发送,而不是json。他们在他们的文档中的示例cURL请求是:
curl -i -X POST -d 'api_key=my_api_key' -d
'email=john@doe.com' -d "first_name=Joe" -d "last_name=Doe" -d
"cust_id=cus_401"
https://serviceurl.com/api/create
我的代码显然是向他们的api发送空参数。
$service_url = 'https://serviceurl.com/api/create';
$curl = curl_init($service_url);
$email = $this->session->userdata('email');
$postArray = array(
'api_key' => 'my_api_key',
'email' => $email,
);
$curl_post_data = $postArray;
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
$curl_response = curl_exec($curl);
if ($curl_response === false) {
$info = curl_getinfo($curl);
curl_close($curl);
die('error occured during curl exec. Additioanl info: ' . var_export($info));
}
curl_close($curl);
echo $curl_response;
echo $info;
非常感谢任何建议。
答案 0 :(得分:0)
你的curl php代码以multipart/form-data
格式发送数据,但是从他们的cli调用示例可以看出,他们的api想要application/x-www-form-urlencoded
格式的数据。
as explained by the curl_setopt docs,当你给CURLOPT_POSTFIELDS一个数组时,它会自动编码为multipart/form-data
,如果你给它一个字符串,application/x-www-form-urlencoded
将自动被假定,并且是他们的卷曲cli调用正在使用。
幸运的是,PHP有一个专用函数,用于将数组编码为application/x-www-form-urlencoded
格式,称为http_build_query
,因此
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($curl_post_data));
会解决您apparently sending empty parameters
的问题。
另外,如果设置任何选项时出现问题,curl_setopt将返回bool(false),你的代码完全忽略了它,并且会被忽视,你应该修复它,考虑使用一个错误捕获的setopt包装器,像
function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
$ret=curl_setopt($ch,$option,$value);
if($ret!==true){
//option should be obvious by stack trace
throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . $ch .'. curl_error: '.curl_error($ch) );
}
return true;
}