有时Google Maps API会根据德国邮政编码返回500 server error
响应,我无法理解原因。
我希望它足够具体。 有什么想法吗?
https://maps.googleapis.com/maps/api/geocode/json?key={api_key}&address={postal_code}&language=de®ion=de&components=country:DE&sensor=false
答案 0 :(得分:0)
由于您指定问题不是给定地址而是看似“随机”行为,因此这可能属于其他“着名”API的documented行为。
至于其他情况,建议的策略是Exponential backoff for the Geocoding API,这基本上意味着您必须在一定延迟后重试。
如果上述链接出现故障或发生变化,我引用文章:
指数退避
在极少数情况下,服务于您的请求可能会出错;您可能会收到4XX或5XX HTTP响应代码,或TCP连接可能只是在您的客户端和Google服务器之间的某处失败。通常,重新尝试请求是值得的,因为后续请求可能会在原始失败时成功。但是,重要的是不要简单地循环向Google的服务器发出请求。这种循环行为可能会使客户端与Google之间的网络过载,从而导致许多方面出现问题。
更好的方法是在尝试之间增加延迟时重试。通常,每次尝试都会通过乘法因子增加延迟,这种方法称为指数退避。
例如,考虑一个希望向Google Maps Time Zone API提出此请求的应用程序:
以下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
当然,这不会解决你提到的“错误回应”;我怀疑这取决于数据质量,并不是随机发生的。