将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')
问题分析与解决方案
问题根源
- Authorization头格式错误:代码中
'Authorization' => 'Bearer :' . $token多了一个多余的冒号,正确格式应为Bearer {$token},无需额外冒号。 - 请求头数组格式不统一:
$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
相关产品推荐
相关产品推荐

