PHP cURL设置CURLOPT_POSTFIELDS调用Cloudflare Stream返回400错误
问题原因
核心错误是请求头声明的内容格式与实际传递的POST数据格式不匹配:
- 代码中手动设置请求头
Content-Type: application/json,告知接口接收方当前发送的是JSON格式数据 - 但实际传入
CURLOPT_POSTFIELDS的参数是downloadable=true,属于application/x-www-form-urlencoded格式的表单字符串,不是合法JSON结构,接口解析请求体失败就会直接返回400 Bad Request错误。
修复方案
将POST参数转换为合法JSON字符串后再传递即可,修正后的代码如下:
$tokench = curl_init(); curl_setopt($tokench, CURLOPT_URL, "https://api.cloudflare.com/client/v4/accounts/".getenv("CLOUDFLARE_ACCOUNT")."/stream/".urlencode($_GET["video"])."/token"); curl_setopt($tokench, CURLOPT_POST, 1); curl_setopt($tokench, CURLOPT_RETURNTRANSFER, true); curl_setopt($tokench, CURLOPT_HTTPHEADER, [ "Authorization: Bearer ".getenv("CLOUDFLARE_TOKEN"), "Content-Type: application/json" ]); // 组装参数并转为JSON格式 $postPayload = json_encode([ "downloadable" => true ]); curl_setopt($tokench, CURLOPT_POSTFIELDS, $postPayload); $tokenraw = curl_exec($tokench); curl_close($tokench); $tokenarr = json_decode($tokenraw, true);
补充说明
- 如果修改后仍返回错误,可尝试将
downloadable的参数值改为字符串形式的"true"适配接口参数要求 - 建议增加cURL错误捕获逻辑,通过
curl_error($tokench)先判断请求本身是否存在网络、证书类问题,再解析接口返回内容 - 注意对
$_GET["video"]入参做合法性校验,避免未授权的接口调用。
内容的提问来源于stack exchange,提问作者AlexTech01
相关产品推荐
相关产品推荐

