Laravel中Google Places API返回200却提示INVALID_REQUEST问题
解决Google Places API迭代调用时的INVALID_REQUEST问题
我之前也碰到过一模一样的坑!第一次请求顺利拿到20条数据,但用next_page_token发起后续请求就报INVALID_REQUEST,直接在浏览器敲URL又完全正常,当时折腾了好一阵子才找到原因。结合我的踩坑经验,给你几个排查和解决方向:
最可能的原因:请求发送时机太早
Google Places API的next_page_token并不是生成后立刻就能用的,官方文档里隐晦提到过——token需要2-3秒的时间同步到他们的全球服务器集群。如果你的Laravel代码在拿到token后立刻发起下一次请求,服务器还没同步这个token,自然就返回无效请求了。解决方法很简单,在两次请求之间加个延迟:
$response = Http::get('https://maps.googleapis.com/maps/api/place/nearbysearch/json', [ 'location' => '你的坐标', 'radius' => 5000, 'key' => env('GOOGLE_PLACES_API_KEY'), ]); $nextPageToken = $response->json('next_page_token'); if ($nextPageToken) { // 强制等待3秒,给Google服务器同步token的时间 sleep(3); // 发起下一页请求,只需要传pagetoken和key即可 $nextResponse = Http::get('https://maps.googleapis.com/maps/api/place/nearbysearch/json', [ 'pagetoken' => $nextPageToken, 'key' => env('GOOGLE_PLACES_API_KEY'), ]); }检查请求参数的一致性
虽然你说浏览器访问没问题,但要确认后续请求的参数是否合规:后续请求不需要再传location、radius这些初始参数,只需要pagetoken和key。如果你的代码不小心重复传了和第一次不一致的参数(比如radius改了),也可能触发INVALID_REQUEST。排查HTTP客户端的头信息差异
Laravel的Http客户端默认带的头信息可能和浏览器不一样,你可以尝试模拟浏览器的User-Agent发起请求:$nextResponse = Http::withHeaders([ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', ])->get('https://maps.googleapis.com/maps/api/place/nearbysearch/json', [ 'pagetoken' => $nextPageToken, 'key' => env('GOOGLE_PLACES_API_KEY'), ]);
其中第一个延迟的方法是我当时解决问题的关键,你可以先试试这个方案,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

