Die Google Maps Platform-Webdienste sind eine Sammlung von HTTP-Schnittstellen zu Google-Diensten, die geografische Daten für Ihre Kartenanwendungen bereitstellen.
In diesem Leitfaden werden einige gängige Praktiken beschrieben, die beim Einrichten von Webdienstanfragen und beim Verarbeiten von Dienstantworten hilfreich sind. Eine vollständige Dokumentation der Geolocation API finden Sie im Entwicklerleitfaden.
Was ist ein Webdienst?
Die Webdienste der Google Maps Platform sind eine Schnittstelle, über die Sie Google Maps API-Daten von externen Diensten anfordern und in Ihren Maps-Anwendungen verwenden können. Diese Dienste sind gemäß den Lizenzbeschränkungen in den Nutzungsbedingungen für die Google Maps Platform für die Verwendung in Verbindung mit einer Karte vorgesehen.
Die Webdienste der Maps APIs verwenden HTTP(S)-Anfragen an bestimmte URLs und übergeben URL-Parameter und/oder POST-Daten im JSON-Format als Argumente an die Dienste. Im Allgemeinen geben diese Dienste Daten im Antworttext als JSON zurück, damit sie von Ihrer Anwendung geparst und/oder verarbeitet werden können.
Geolocation-Anforderungen werden mit POST an die folgende URL gesendet:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
Hinweis: Für alle Geolocation API-Anwendungen ist eine Authentifizierung erforderlich. Weitere Informationen zu Anmeldedaten für die Authentifizierung
SSL/TLS-Zugriff
HTTPS ist für alle Google Maps Platform-Anfragen erforderlich, die API-Schlüssel verwenden oder Nutzerdaten enthalten. Anfragen über HTTP, die sensible Daten enthalten, werden möglicherweise abgelehnt.
Respektvolle Nutzung der Google APIs
Schlecht konzipierte API-Clients können sowohl das Internet als auch die Google-Server stärker belasten als nötig. Dieser Abschnitt enthält einige bewährte Methoden für Kunden der APIs. Wenn Sie diese Best Practices befolgen, lässt sich vermeiden, dass Ihre Anwendung aufgrund von unbeabsichtigtem Missbrauch der APIs blockiert wird.
Exponential Backoff
In seltenen Fällen kann beim Ausführen Ihrer Anfrage ein Fehler auftreten. Sie erhalten dann möglicherweise einen 4XX- oder 5XX-HTTP-Antwortcode oder die TCP-Verbindung bricht irgendwo zwischen Ihrem Client und dem Google-Server ab. Oft lohnt es sich, die Anfrage noch einmal zu stellen, da die Folgeanfrage erfolgreich sein kann, wenn die ursprüngliche fehlgeschlagen ist. Es ist jedoch wichtig, nicht einfach wiederholt Anfragen an die Google-Server zu senden. Dieses Looping-Verhalten kann das Netzwerk zwischen Ihrem Kunden und Google überlasten und zu Problemen für viele Parteien führen.
Ein besserer Ansatz ist es, wiederholte Versuche in immer größeren Abständen durchzuführen. Normalerweise wird die Verzögerung bei jedem Versuch um einen Multiplikator erhöht. Dieser Ansatz wird als exponentieller Backoff bezeichnet.
Angenommen, eine Anwendung möchte diese Anfrage an die Time Zone API senden:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEY
Im folgenden Beispiel mit Python wird gezeigt, wie die Anforderung mit exponentiellem Backoff durchgeführt wird:
import json import time import urllib.error import urllib.parse import urllib.request # 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 API_KEY = "YOUR_KEY_HERE" TIMEZONE_BASE_URL = "https://maps.googleapis.com/maps/api/timezone/json" def timezone(lat, lng, timestamp): # Join the parts of the URL together into one string. params = urllib.parse.urlencode( {"location": f"{lat},{lng}", "timestamp": timestamp, "key": API_KEY,} ) url = f"{TIMEZONE_BASE_URL}?{params}" current_delay = 0.1 # Set the initial retry delay to 100ms. max_delay = 5 # Set the maximum retry delay to 5 seconds. while True: try: # Get the API response. response = urllib.request.urlopen(url) except urllib.error.URLError: pass # Fall through to the retry loop. else: # If we didn't get an IOError then parse the result. result = json.load(response) 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. if __name__ == "__main__": tz = timezone(39.6034810, -119.6822510, 1331161200) print(f"Timezone: {tz}")
Außerdem sollten Sie darauf achten, dass sich in der Aufrufabfolge der Anwendung kein Code zum Wiederholen befindet, der zu wiederholten Anfragen in schneller Folge führt.
Synchronisierte Anforderungen
Eine große Anzahl synchronisierter Anfragen an die APIs von Google kann wie ein DDoS-Angriff (Distributed Denial of Service) auf die Infrastruktur von Google aussehen und entsprechend behandelt werden. Um dies zu vermeiden, sollten Sie dafür sorgen, dass API-Anfragen nicht zwischen Clients synchronisiert werden.
Angenommen, eine Anwendung zeigt die Zeit in der aktuellen Zeitzone an. Diese Anwendung stellt wahrscheinlich einen Wecker im Clientbetriebssystem ein, der es zu Beginn der Minute weckt, damit die angezeigte Uhrzeit aktualisiert werden kann. Die Anwendung darf im Rahmen der Verarbeitung, die mit dieser Benachrichtigung verknüpft ist, keine API-Aufrufe ausführen.
API-Aufrufe als Reaktion auf einen festen Wecker sind nicht empfehlenswert, da die API-Aufrufe dann sogar zwischen verschiedenen Geräten auf den Beginn der Minute synchronisiert werden, anstatt gleichmäßig über die Zeit verteilt zu werden. Eine schlecht konzipierte Anwendung, die dies tut, führt zu einem Anstieg der Zugriffe, der zu Beginn jeder Minute sechzigmal höher ist als normal.
Stattdessen wird bei einer guten Lösung ein zweiter Alarm für eine zufällig gewählte Zeit festgelegt. Wenn dieser zweite Alarm ausgelöst wird, ruft die Anwendung alle erforderlichen APIs auf und speichert die Ergebnisse. Wenn die Anwendung die Anzeige zu Beginn der Minute aktualisieren möchte, verwendet sie zuvor gespeicherte Ergebnisse, anstatt die API noch einmal aufzurufen. Bei diesem Ansatz werden API-Aufrufe gleichmäßig über die Zeit verteilt. Außerdem verzögern die API-Aufrufe das Rendering nicht, wenn das Display aktualisiert wird.
Neben dem Beginn der Minute sollten Sie nicht auch den Beginn einer Stunde und den Beginn eines jeden Tages um Mitternacht für die Synchronisierung verwenden.
Verarbeiten von Antworten
In diesem Abschnitt wird erklärt, wie Sie diese Werte dynamisch aus den Webdienstantworten extrahieren.
Die Google Maps-Webdienste liefern Antworten, die leicht verständlich, aber nicht gerade nutzerfreundlich sind. Wenn Sie eine Abfrage ausführen, möchten Sie wahrscheinlich nicht nur eine Datenmenge anzeigen lassen, sondern einige bestimmte Werte extrahieren. Im Allgemeinen sollten Sie Antworten vom Webservice parsen und nur die Werte extrahieren, die Sie interessieren.
Welches Parseschema Sie verwenden, hängt davon ab, ob Sie die Ausgabe in JSON zurückgeben. JSON-Antworten, die bereits in Form von JavaScript-Objekten vorliegen, können im Client in JavaScript selbst verarbeitet werden.