You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Curl代码转换为Guzzle时遭遇请求头无效错误的技术问询

问题排查:Curl转Guzzle请求头错误问题

原可正常运行的Curl代码

$curl = curl_init($this->communityUrl . 'api' . $this->endpointCategories);                 
$array = [
    CURLOPT_RETURNTRANSFER  => TRUE,
    CURLOPT_USERAGENT       =>"MyUserAgent/1.0",
    CURLOPT_HTTPHEADER  => array( "Authorization: Bearer {$token}" ),
];

curl_setopt_array($curl, $array);

$response = curl_exec($curl);

转换后的Guzzle风格代码(存在问题)

$headers = [
    'Authorization' => 'Bearer :' . $token,
    'User-Agent: MyUserAgent/1.0'
    // 'User-Agent' => 'MyUserAgent/1.0' // try this also not work see php loop
];

$response = HTTP::getResponse([
    'url' =>  $this->communityUrl . 'api' . $this->endpointCategories,
    'header' => $headers,
    'method' => 'GET'
]);

请求头处理循环代码

if (!empty($data['header'])) {
    foreach ($data['header'] as $h) {
        [$key, $value] = explode(':', $h, 2); 

        $options['headers'][$key] = $value;

        unset($key);
        unset($value);
    }
}

触发的错误信息

HTTP::getResponse($data = ['url' => 'https://www.mywebsite.com/forum/api/downloads/categories?perPage=150', 'header' => ['Authorization' => 'Bearer :6a957ad3fec7dc151b8fa9c5dcb7e63a_67e4abf29ee40225b2b9272c822d14e2eb890fff1b7f68e29fb944dce0b4d109', 0 => 'User-Agent: MyUserAgent/1.0'], 'method' => 'GET']) 

[15-Jan-2023 21:59:43 UTC] PHP   6. trigger_error($message = '"Bearer " is not valid header name')

问题分析与解决方案

问题根源

  1. Authorization头格式错误:代码中'Authorization' => 'Bearer :' . $token多了一个多余的冒号,正确格式应为Bearer {$token},无需额外冒号。
  2. 请求头数组格式不统一:$headers数组混合了两种格式——关联键值对(Authorization)和字符串格式(User-Agent),但现有处理循环仅适配**Key: Value形式的字符串**请求头。

修复步骤

方法一:统一使用字符串格式请求头(适配现有处理循环)

修改$headers数组,全部采用Key: Value的字符串形式:

$headers = [
    "Authorization: Bearer {$token}",
    "User-Agent: MyUserAgent/1.0"
];

$response = HTTP::getResponse([
    'url' =>  $this->communityUrl . 'api' . $this->endpointCategories,
    'header' => $headers,
    'method' => 'GET'
]);

此写法能让处理循环通过explode(':', $h, 2)正确拆分出头名称和值,避免错误。

方法二:修改处理循环适配关联数组格式(更符合Guzzle习惯)

若想保留关联键值对的写法,需调整请求头处理逻辑,兼容两种格式:

if (!empty($data['header'])) {
    foreach ($data['header'] as $key => $h) {
        if (is_string($key)) {
            // 关联数组格式,直接赋值
            $options['headers'][$key] = $h;
        } else {
            // 字符串格式,拆分处理
            [$headerKey, $headerValue] = explode(':', $h, 2); 
            $options['headers'][$headerKey] = $headerValue;
        }
    }
}

同时修正Authorization头的格式:

$headers = [
    'Authorization' => "Bearer {$token}",
    'User-Agent' => 'MyUserAgent/1.0'
];

验证要点

  • 确保Authorization头格式为Bearer 令牌内容,无多余冒号
  • 请求头数组格式统一,要么全是Key: Value字符串,要么全是关联键值对
  • 处理循环逻辑需和传入的请求头格式匹配

内容的提问来源于stack exchange,提问作者yostijognu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:35:32