I servizi web di Google Maps Platform sono una raccolta di interfacce HTTP per i servizi Google che forniscono dati geografici per le tue applicazioni di mappe.
Questa guida descrive alcune pratiche comuni utili per configurare le richieste di servizi web ed elaborare le risposte dei servizi. Per la documentazione completa dell'API Geolocation, consulta la Guida per gli sviluppatori.
Che cos'è un servizio web?
I servizi web di Google Maps Platform sono un'interfaccia per richiedere i dati delle API di Maps da servizi esterni e utilizzarli nelle tue applicazioni Maps. Questi servizi sono progettati per essere utilizzati insieme a una mappa, come indicato nelle Restrizioni della licenza dei Termini di servizio di Google Maps Platform.
I servizi web delle API di Google Maps utilizzano richieste HTTP(S) a URL specifici, passando parametri URL e/o dati POST in formato JSON come argomenti ai servizi. In genere, questi servizi restituiscono i dati nel corpo della risposta in formato JSON per l'analisi e/o l'elaborazione da parte della tua applicazione.
Le richieste di geolocalizzazione vengono inviate utilizzando POST al seguente URL:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
Nota: tutte le applicazioni dell'API Geolocation richiedono l'autenticazione. Scopri di più sulle credenziali di autenticazione.
Accesso SSL/TLS
HTTPS è obbligatorio per tutte le richieste di Google Maps Platform che utilizzano chiavi API o contengono dati utente. Le richieste effettuate tramite HTTP che contengono dati sensibili potrebbero essere rifiutate.
Utilizzo corretto delle API di Google
I client API progettati in modo inadeguato possono caricare più del necessario sia internet sia i server di Google. Questa sezione contiene alcune best practice per i client delle API. Seguire queste best practice può aiutarti a evitare che la tua applicazione venga bloccata per un abuso involontario delle API.
Backoff esponenziale
In rari casi, potrebbe verificarsi un problema durante l'elaborazione della richiesta. Potresti ricevere un codice di risposta HTTP 4XX o 5XX oppure la connessione TCP potrebbe semplicemente non riuscire tra il tuo client e il server di Google. Spesso vale la pena riprovare a inviare la richiesta, poiché la richiesta successiva potrebbe andare a buon fine anche se quella originale non è riuscita. Tuttavia, è importante non limitarsi a ripetere in loop le richieste ai server di Google. Questo comportamento di loop può sovraccaricare la rete tra il tuo client e Google, causando problemi a molte parti.
Un approccio migliore consiste nel riprovare con ritardi crescenti tra un tentativo e l'altro. In genere, il ritardo viene aumentato di un fattore moltiplicativo a ogni tentativo, un approccio noto come backoff esponenziale.
Ad esempio, considera un'applicazione che vuole inviare questa richiesta all'API Time Zone:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEYL'esempio Python seguente mostra come effettuare la richiesta con backoff esponenziale:
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}")
Inoltre, devi assicurarti che non sia presente un codice di nuovo tentativo più in alto nella catena di chiamate dell'applicazione che porta a richieste ripetute in rapida successione.
Richieste sincronizzate
Un numero elevato di richieste sincronizzate alle API di Google può sembrare un attacco Distributed Denial of Service (DDoS) all'infrastruttura di Google e venire trattato di conseguenza. Per evitare questo problema, devi assicurarti che le richieste API non siano sincronizzate tra i client.
Ad esempio, considera un'applicazione che mostra l'ora nel fuso orario corrente. Questa applicazione probabilmente imposterà una sveglia nel sistema operativo client, attivandolo all'inizio del minuto in modo che l'ora visualizzata possa essere aggiornata. L'applicazione non deve effettuare chiamate API nell'ambito dell'elaborazione associata a quell'allarme.
Effettuare chiamate API in risposta a una sveglia fissa è sconsigliato perché le chiamate API vengono sincronizzate con l'inizio del minuto, anche tra dispositivi diversi, anziché essere distribuite in modo uniforme nel tempo. Un'applicazione progettata male che esegue questa operazione produrrà un picco di traffico 60 volte superiore ai livelli normali all'inizio di ogni minuto.
Invece, un possibile buon design è impostare una seconda sveglia a un'ora scelta in modo casuale. Quando viene attivata questa seconda sveglia, l'applicazione chiama tutte le API di cui ha bisogno e memorizza i risultati. Quando l'applicazione vuole aggiornare il display all'inizio del minuto, utilizza i risultati memorizzati in precedenza anziché chiamare nuovamente l'API. Con questo approccio, le chiamate API vengono distribuite in modo uniforme nel tempo. Inoltre, le chiamate API non ritardano il rendering quando il display viene aggiornato.
Oltre all'inizio del minuto, altri orari di sincronizzazione comuni che dovresti fare attenzione a non scegliere come target sono l'inizio di un'ora e l'inizio di ogni giorno a mezzanotte.
Elaborazione delle risposte
Questa sezione illustra come estrarre questi valori in modo dinamico dalle risposte del servizio web.
I servizi web di Google Maps forniscono risposte facili da comprendere, ma non esattamente facili da usare. Quando esegui una query, anziché visualizzare un insieme di dati, probabilmente vuoi estrarre alcuni valori specifici. In genere, è consigliabile analizzare le risposte del servizio web ed estrarre solo i valori di interesse.
Lo schema di analisi che utilizzi dipende dal fatto che tu restituisca o meno l'output in JSON. Le risposte JSON, essendo già sotto forma di oggetti JavaScript, possono essere elaborate all'interno di JavaScript stesso sul client.