有时Google Geocoding API会返回500服务器错误

时间:2018-03-09 09:02:04

标签: api google-maps server-error

有时Google Maps API会根据德国邮政编码返回500 server error响应,我无法理解原因。

我希望它足够具体。 有什么想法吗?

https://maps.googleapis.com/maps/api/geocode/json?key={api_key}&address={postal_code}&language=de&region=de&components=country:DE&sensor=false

1 个答案:

答案 0 :(得分:0)

由于您指定问题不是给定地址而是看似“随机”行为,因此这可能属于其他“着名”API的documented行为。

至于其他情况,建议的策略是Exponential backoff for the Geocoding API,这基本上意味着您必须在一定延迟后重试。

如果上述链接出现故障或发生变化,我引用文章:

  

指数退避

     

在极少数情况下,服务于您的请求可能会出错;您可能会收到4XX或5XX HTTP响应代码,或TCP连接可能只是在您的客户端和Google服务器之间的某处失败。通常,重新尝试请求是值得的,因为后续请求可能会在原始失败时成功。但是,重要的是不要简单地循环向Google的服务器发出请求。这种循环行为可能会使客户端与Google之间的网络过载,从而导致许多方面出现问题。

     

更好的方法是在尝试之间增加延迟时重试。通常,每次尝试都会通过乘法因子增加延迟,这种方法称为指数退避。

     

例如,考虑一个希望向Google Maps Time Zone API提出此请求的应用程序:

     

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&key=YOUR_API_KEY

     

以下Python示例演示了如何使用指数退避来生成请求:

import json
import time
import urllib
import urllib2

def timezone(lat, lng, timestamp):
    # The maps_key defined below isn't a valid Google Maps API key.
    # You need to get your own API key.
    # See https://developers.google.com/maps/documentation/timezone/get-api-key
    maps_key = 'YOUR_KEY_HERE'
    timezone_base_url = 'https://maps.googleapis.com/maps/api/timezone/json'

    # This joins the parts of the URL together into one string.
    url = timezone_base_url + '?' + urllib.urlencode({
        'location': "%s,%s" % (lat, lng),
        'timestamp': timestamp,
        'key': maps_key,
    })

    current_delay = 0.1  # Set the initial retry delay to 100ms.
    max_delay = 3600  # Set the maximum retry delay to 1 hour.

    while True:
        try:
            # Get the API response.
            response = str(urllib2.urlopen(url).read())
        except IOError:
            pass  # Fall through to the retry loop.
        else:
            # If we didn't get an IOError then parse the result.
            result = json.loads(response.replace('\\n', ''))
            if result['status'] == 'OK':
                return result['timeZoneId']
            elif result['status'] != 'UNKNOWN_ERROR':
                # Many API errors cannot be fixed by a retry, e.g. INVALID_REQUEST or
                # ZERO_RESULTS. There is no point retrying these requests.
                raise Exception(result['error_message'])

        if current_delay > max_delay:
            raise Exception('Too many retry attempts.')
        print 'Waiting', current_delay, 'seconds before retrying.'
        time.sleep(current_delay)
        current_delay *= 2  # Increase the delay each time we retry.

tz = timezone(39.6034810, -119.6822510, 1331161200)
print 'Timezone:', tz

当然,这不会解决你提到的“错误回应”;我怀疑这取决于数据质量,并不是随机发生的。