在Laravel中配置curl请求调用Cloudflare Stream API及报错解决
报错根因定位
你的代码报错本质是请求配置完全不符合Cloudflare Stream直传接口的要求,导致接口返回错误结构,无法正常解析到uploadURL字段,具体问题点:
- 参数位置错配:要求的
direct_user=true是URL查询参数,你错误把它当成POST表单参数放在请求体里,接口无法识别 - 缺失必填请求头:没有携带接口强制要求的
Tus-Resumable: 1.0.0、Upload-Length两个头,接口会直接拒绝请求返回错误内容 - 请求配置冲突:连续两次设置
CURLOPT_POSTFIELDS,第一次设置的JSON格式请求体会被第二次的数组完全覆盖,同时错配了表单格式的Content-Type,请求体不符合接口入参要求 - 缺少异常校验:直接把json_decode的返回值当正常对象取属性,只要接口返回空、返回错误、网络超时,就会触发“尝试获取非对象属性”的报错
- URL路径不匹配:原代码请求的地址多了末尾斜杠,和要求的接口路径不一致
正确实现方案
1. 修正原生CURL写法
按照接口要求调整所有请求配置,同时增加前置校验避免直接取属性报错,参考代码:
public function createVideo(){ // 替换为你的实际Cloudflare账号ID、API密钥 $accountId = '你的账号ID'; $apiToken = '你的Bearer密钥'; $uploadByteSize = 900000000; $ch = curl_init(); // 正确拼接带查询参数的请求地址 curl_setopt($ch, CURLOPT_URL, "https://api.cloudflare.com/client/v4/accounts/{$accountId}/stream?direct_user=true"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); // 补齐所有接口要求的请求头 $headers = [ "Authorization: Bearer {$apiToken}", "Tus-Resumable: 1.0.0", "Upload-Length: {$uploadByteSize}", "Content-Type: application/json" ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 正确设置请求体 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ "maxDurationSeconds" => 3600 ])); $result = curl_exec($ch); $curlError = curl_error($ch); curl_close($ch); // 分层校验返回内容,避免直接取非对象属性 if ($curlError) { return back()->withErrors("CURL请求异常:{$curlError}"); } $response = json_decode($result); if (!isset($response->result->uploadURL)) { $errorMsg = $response->errors[0]->message ?? $result; return back()->withErrors("接口返回异常:{$errorMsg}"); } $uploadUrl = $response->result->uploadURL; return view('school.createvideo')->with('url', $uploadUrl); }
2. 更推荐的Laravel原生Http客户端写法
避免手动配置CURL容易漏项的问题,代码更简洁,异常处理更完善:
首先在控制器顶部引入Http门面:
use Illuminate\Support\Facades\Http;
然后调整方法实现:
public function createVideo(){ $accountId = '你的账号ID'; $apiToken = '你的Bearer密钥'; $uploadByteSize = 900000000; $response = Http::withHeaders([ 'Authorization' => "Bearer {$apiToken}", 'Tus-Resumable' => '1.0.0', 'Upload-Length' => $uploadByteSize ]) ->withQueryParameters([ 'direct_user' => 'true' ]) ->post( "https://api.cloudflare.com/client/v4/accounts/{$accountId}/stream", [ 'maxDurationSeconds' => 3600 ] ); // 自动处理请求失败、返回结构异常的场景 if ($response->failed()) { return back()->withErrors("接口请求失败:" . $response->body()); } $uploadUrl = $response->json('result.uploadURL'); if (!$uploadUrl) { return back()->withErrors("未获取到合法上传地址,接口返回:" . $response->body()); } return view('school.createvideo')->with('url', $uploadUrl); }
避坑提示
- 所有和Tus协议相关的上传请求头,必须和要求的字段名、值完全一致,大小写、格式错了都会被接口拒绝
- 调用第三方接口时,不要直接链式取返回值的属性,一定要先判断返回结构是否存在对应字段,否则只要接口返回不符合预期就会触发运行时报错
- 配置请求参数时,先明确参数是属于URL查询参数、请求头、还是请求体部分,放错位置接口不会识别
内容的提问来源于stack exchange,提问作者rockbust
相关产品推荐
相关产品推荐

