如何通过CURL从API响应头中获取认证会话值?
问题分析与解决方案
核心问题
- 回调函数参数错误:
CURLOPT_HEADERFUNCTION的回调函数签名应为function($curl, $header_line),你错误地将第二个参数命名为$Auth,且未引用外部的$Auth数组,导致外部$Auth始终为空。 - 逻辑混淆:你在回调里把头部内容存入
$response_headers,但最后却尝试访问空的$Auth数组,自然触发"Undefined array key 0"警告。
修正后的代码
$init = curl_init(); // 用于存储目标认证头的值 $Auth = []; $header_callback = function($curl, $header_line) use (&$Auth) { // 去除每行头信息末尾的换行符与空白 $header_line = trim($header_line); // 替换成你实际要获取的响应头名称(比如"Authorization:"或自定义头) $target_header = 'Auth-Token:'; if (strpos($header_line, $target_header) === 0) { // 提取头信息的值,去掉前缀与多余空格 $header_value = trim(substr($header_line, strlen($target_header))); $Auth[] = $header_value; } // 必须返回当前行的长度,否则curl会终止请求 return strlen($header_line); }; curl_setopt_array($init, [ CURLOPT_URL => 'http://ip-api/v1/rest/auth', CURLOPT_HEADER => false, // 无需让响应头混入响应体,由回调单独处理 CURLOPT_HEADERFUNCTION => $header_callback, CURLOPT_RETURNTRANSFER => true, // 让curl_exec返回响应体而非直接输出 // 若API要求POST请求,需添加CURLOPT_POST、CURLOPT_POSTFIELDS等参数 ]); $output = curl_exec($init); // 检查curl请求是否出错 if(curl_errno($init)){ echo '请求错误: ' . curl_error($init); } // 输出提取到的认证头 var_dump($Auth); if(!empty($Auth)){ echo $Auth[0]; } curl_close($init);
关键修改说明
- 修正回调函数的参数签名,并通过
use (&$Auth)引用外部数组,确保头信息能存入目标变量。 - 添加头信息过滤逻辑,可根据实际需要修改
$target_header的值,精准提取你需要的响应头。 - 增加请求错误检查,方便排查API连接或请求异常问题。
内容的提问来源于stack exchange,提问作者F-A
相关产品推荐
相关产品推荐

