百度云API出现unsupported_grant_type错误的解决方法
2023-07-23 05:21
原创
最近使用百度云做一个项目,一上手就遇到这样一个错误:
{"error":"unsupported_grant_type","error_description":"The authorization grant type is not supported"}
我用的是PHP语言,代码整理如下:
function https_request($url,$arr = NULL)
{
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_TIMEOUT,15);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
//curl_setopt($curl,CURLOPT_HEADER,true);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($arr));
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
$postData = array(
'grant_type' => 'client_credentials',
'client_id' => 'fWPO7I****GZQxwa',
'client_secret' => 'UVEbsd****9inCy6'
);
$url = 'https://aip.baidubce.com/oauth/2.0/token';
$json = https_request($url,$postData);
echo $json;
经过研究,问题出在这一行代码:
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($arr));
这行代码是将数组打包成json发送给服务器,在很多情景中是没有问题的,尤其是我们自己写的API。但一些云服务平台要求将数据组织成一个经过urlencode之后的请求字符串,即类似 aaa=bbb&ccc=ddd&eee=fff&ggg=hhh 的形式。
将这行代码改为:
curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($arr));
问题即得到解决。这里用到了PHP的内置函数http_build_query(),它可以将数组转化为请求字符串。虽然本案例使用的是PHP语言,但相信对其它语言同样具有参考价值。