【问题标题】:Google Places Library OVER_QUERY_LIMIT with new API key带有新 API 密钥的 Google 地方信息库 OVER_QUERY_LIMIT
【发布时间】:2015-03-24 12:17:36
【问题描述】:

我在我的 javascript 应用程序中使用 Places 库。当我使用service.nearbySearch() 方法查找附近的地方时,它工作正常。然后,当我发出service.getDetails() 请求时,我会为每个请求获得OVER_QUERY_LIMIT 状态。在我的开发者控制台中,我可以跟踪对 Google Maps JavaScript API v3 发出的每个请求,但我没有从地点 API 获得任何结果。

以下是部分代码:

// How I load the library 
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=API_KEY"></script>

// My places request
var places = new google.maps.places.PlacesService(map);
var location = new google.maps.LatLng(lat, lng);
var request = {
    location: location,
    radius: radius,
    types: [type]
  };

places.nearbySearch(request, function(results, status, pagination) {

    if (status === google.maps.places.PlacesServiceStatus.OK) {
      for (var i = 0; i < results.length; i++) {

      // Get the details for each place
      var detailsRequest = { placeId: results[i].id }

      places.getDetails(detailsRequest, function(place, status) {
        if (status == google.maps.places.PlacesServiceStatus.OK) {
            console.log('PLACE', place)
        } else {
            console.log('STATUS', status)
        }        
    })              
  };
}

有什么想法吗?

【问题讨论】:

  • 您应该在 Google 地图文档中查找 OVER_QUERY_LIMIT 的含义。
  • 我知道这意味着什么。我没有达到接近 1k 的限制。更不用说我能够跟踪与我的 API 密钥相关联的请求数量。问题是它根本不应该返回那个

标签: javascript google-maps google-places-api


【解决方案1】:

也遇到了同样的问题。似乎您有一个可以耗尽 9 或 10 个请求的池,然后每 1 秒获得一个额外请求的配额。

有人说 API 的服务器端版本允许每秒 50 个请求,所以我猜 Google 正在努力防止客户端实例过载,这是有道理的。

对我来说,在 getDetails 结果进入时让 UI 显示微调器就足够了。所以我只是在前 9 或 10 个之后限制了请求,如下所示:

nearbySearchCallback: function (places, status) {
  var that = this;
  if (status === window.google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < places.length; i++) {
      // You seem to have a pool of 9 or 10 requests to exhaust,
      // then you get another request every second therein. 
      (function (i) {
        setTimeout(function () {
          service.getDetails({ placeId: places[i].place_id }, that.getDetailsCallback);
        }, i < 9 ? 0 : 1000 * i);
      })(i);
    }
  }
},
getDetailsCallback: function (place, status) {  /* ... */ }

【讨论】:

    【解决方案2】:

    答案是我请求.getDetails() 方法的速度太快了。 Docs.

    我正在迭代几十个位置并且请求太多太快。很多时候,在出现OVER_QUERY_LIMIT 错误之前,我只会得到 60 多个结果中的前 10 个或 12 个。

    我将对.getDetails() 的调用移至标记的点击事件。这样一次只发送一个请求。

    【讨论】:

    • 我有同样的问题,但是我们将 PlaceID 存储在数据库中(因为我们希望零售商更新其信息),当我们在地图上加载所有零售商时,我们被 API 阻止了。我没有找到避免这个问题的方法,因为返回位置的唯一 API(至少)是 getDetails API。关于如何在不将所有详细信息存储在数据库中的情况下如何做到这一点的任何其他想法? =/
    • @WagnerBertoliniJunior 你找到解决方案了吗?对我来说,我需要获取仅在 getDetails 响应中的附近搜索地点的网站 URL :(
    • @benmccallum 没有。看来他们不希望我们这样做。我制定了自己的重试逻辑,并在他们允许我这样做时继续询问数据。这减少了读取数据的流量。我学到的另一件事是,如果你打开一个新的窗口/浏览器,事情似乎从头开始,也许只是一种感觉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多