You need to enable JavaScript to run this app. 在Laravel中配置curl请求调用Cloudflare Stream API及报错解决
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 16:45:07