Laravel生产环境调用Google获取用户信息报错:URI must be a string or UriInterface
问题分析与解决方案
核心原因
报错"URI must be a string or UriInterface"大概率是因为request('access_token')在生产环境返回了null、非字符串类型或者空值,导致Guzzle在构建请求URL时无法生成有效的URI。本地环境能正常运行,说明本地传入的access_token是合法的字符串,而生产环境存在参数缺失或类型异常的情况。
解决方案
1. 验证并处理access_token参数
在请求Google接口前,先确保access_token存在且为字符串类型:
use GuzzleHttp\Client; use Illuminate\Support\Facades\Log; // 记录token值用于排查(生产环境可临时开启) Log::info('Access Token received: ', ['token' => request('access_token')]); $accessToken = request('access_token'); // 验证参数有效性 if (empty($accessToken) || !is_string($accessToken)) { abort(400, 'Invalid access token'); } $client = new Client(); $requestAPI = $client->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [ 'headers' => [ 'Content-Type' => 'application/json', ], 'query' => [ 'access_token' => $accessToken ] ]);
2. 强制转换参数类型(快速临时修复)
如果确定参数只是类型问题,可以强制转换为字符串避免报错:
'access_token' => (string) request('access_token', '')
注意:如果access_token为空,Google接口仍会返回错误,但至少能解决当前的URI格式问题。
3. 检查Guzzle版本一致性
确认生产环境的Guzzle版本与本地一致。Laravel 8默认依赖Guzzle 7.x,可通过composer show guzzlehttp/guzzle查看版本,若版本差异较大,执行composer update guzzlehttp/guzzle同步版本。
4. 排查生产环境请求上下文
如果是在非HTTP请求上下文(如队列任务、命令行)中调用这段代码,request()助手函数无法获取到请求参数,会直接返回null,此时需要通过其他方式传递access_token。
内容的提问来源于stack exchange,提问作者user15293852
相关产品推荐
相关产品推荐

