13

我正在收集有关商店位置的信息。搜索是:

<?php
...
$url='https://maps.googleapis.com/maps/api/place/search/json?key=[my_key]&location=40.420989,-3.706812&radius=1000030&=&sensor=false';
$body=file_get_contents($url);
...
?>

我返回一个没有问题的 Json,并表明还有另一页结果。我会回来打另一个电话如下

<?php
...
$url2='https://maps.googleapis.com/maps/api/place/search/json?key=[my_key]&pagetoken=ClREAAAAQXKNHPVGCkTC_MdjSqi2T0KBDMWjEu4KF1Ylw1761Po-67AnNSp4zw0wXD4oocGpx4olSl4k2LyklJBl3mBF4VPmxp3IoOCHDRlXVmivaDsSEBuG_V1GvCH1gS5s0LCuy3EaFNXxUzzHhZ5ZRYNfeGHuqewR6Zk7&sensor=false';
$body=file_get_contents($url2);
...
?>

如果我在第二次调用时运行它,我会收到错误

“状态”-> INVALID_REQUEST

但是当我在结果中粘贴 ulr2 浏览器时是正确的。

我该如何解决?

谢谢

4

5 回答 5

53

它与请求之间的时间有关,如果您一个接一个地立即运行它们,则 pagetoken 还无效,您必须在连续请求之间等待几秒钟。

这是因为 google 的许可条款不允许您一次获取所有结果并将它们一次全部返回给用户。您应该有一个用户操作要求更多结果,这会增加几秒钟的延迟。

于 2013-12-10T16:24:31.140 回答
12

请求之间的 sleep(2) 将解决问题

于 2014-06-19T05:31:19.630 回答
4

睡眠(1.3)是似乎工作的最短时间。换句话说,下一页令牌在上一个 API 请求中返回后大约 1.3 秒变为活动状态。

于 2018-07-15T05:55:00.453 回答
2

请尝试下面的代码,我使用 sleep(2) 函数来延迟请求之间的时间,因为下一个 pagetoken 需要在谷歌服务器上进行验证。您甚至可以使用循环来消除代码重复。

// 你的查询在这里

$query = "";

//这里的api键

$api_key = ""; 

// api调用代码

    try {
        echo $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=" . $query . "&location=40.420989,-3.706812&radius=1000030&=&sensor=false&key=" . $api_key;
        echo "<br>";
        $result = file_get_contents($url);
        $query_results = json_decode($result, true);
        echo "First set" . "<br>";
        print_r($query_results);
        $next_page_token = $query_results['next_page_token'];
        unset($query_results);
        $query_results = array();

        sleep(2);
        echo $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=" . $query . "&location=40.420989,-3.706812&radius=1000030&=&sensor=false&key=" . $api_key . "&pagetoken=" . $next_page_token;
        echo "<br>";
        $result = file_get_contents($url);
        $query_results = json_decode($result, true);
        echo "Second set" . "<br>";
        print_r($query_results);
        $next_page_token = $query_results['next_page_token'];
        unset($query_results);
        $query_results = array();

        sleep(2);
        echo $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=" . $query . "&location=40.420989,-3.706812&radius=1000030&=&sensor=false&key=" . $api_key . "&pagetoken=" . $next_page_token;
        echo "<br>";
        $result = file_get_contents($url);
        $query_results = json_decode($result, true);    
        echo "Third set" . "<br>";
        print_r($query_results);
        unset($query_results);
        $query_results = array();
    } catch (Exception $e) {
        $e->getCode();
        $e->getLine();
    }
于 2015-04-28T11:48:35.270 回答
-2

第一个查询将生成第二页令牌。您只需在 uri 中添加“&pagetoken=tokenvalue”。

当然可以。没有其他选择。

于 2012-12-27T16:54:46.787 回答