web技术

百度云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语言,但相信对其它语言同样具有参考价值。

推荐文章
这篇文章我讲一下腾讯云TTS里面的一些坑,以及解决的方法。我们刚开始使用腾...
最近我想把百度云TTS应用到我的一个小项目中,但刚上手就遇到一个问题:官方...
推荐专题
如何自己建网站?建网站难不难?其实建网站说难不难,说容易也并不容易,难...
本专题精心收集整理了多种HTML+CSS+JS轮播图实现方案,带详细代码和讲解,正...