Best practice per l'utilizzo dei servizi web dell'API Geolocation

I servizi web di Google Maps Platform sono una raccolta di interfacce HTTP di Google che forniscono dati geografici per le applicazioni di Google Maps.

Questa guida descrive alcune pratiche comuni utili per configurare il tuo servizio web ed elaborare le risposte dei servizi. Consulta la guida per gli sviluppatori. per la documentazione completa dell'API Geolocation.

Che cos'è un servizio web?

I servizi web di Google Maps Platform sono un'interfaccia per richiedere i dati dell'API di Google Maps da da servizi esterni e utilizzare i dati all'interno delle applicazioni Maps. Questi servizi progettata per essere utilizzata insieme a una mappa, come Limitazioni di licenza nei Termini di servizio di Google Maps Platform.

I servizi web delle API di Google Maps utilizzano richieste HTTP(S) a URL specifici, trasmettendo parametri URL e/o Dati POST in formato JSON come argomenti per i servizi. In genere, questi servizi restituiscono i dati corpo della risposta come JSON per l'analisi e/o all'elaborazione da parte dell'utente.

Le richieste di geolocalizzazione vengono inviate tramite POST al seguente URL:

https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY

Nota: tutte le applicazioni API Geolocation richiedono l'autenticazione. Leggi ulteriori informazioni sulle credenziali di autenticazione.

Accesso SSL/TLS

HTTPS è richiesto per tutte le richieste di Google Maps Platform che utilizzano chiavi API o che contengono e i dati di Google Cloud. Le richieste effettuate tramite HTTP che contengono dati sensibili potrebbero essere rifiutate.

Utilizzo discreto delle API di Google

I client API progettati in modo scorretto possono applicare più carico del necessario sia su Internet sia nei server di Google. Questa sezione contiene alcune best practice per i client delle API. Persone che seguo queste best practice possono aiutarti a evitare che la tua applicazione venga bloccata per comportamenti illeciti involontari le API.

Backoff esponenziale

In rari casi, si potrebbe verificare un problema nella gestione della tua richiesta. potresti ricevere un HTTP 4XX o 5XX del codice di risposta o semplicemente la connessione TCP non riesce in qualche punto tra il client o server web. Spesso vale la pena ritentare la richiesta la richiesta di follow-up potrebbe avere esito positivo se l'originale non è andato a buon fine. Tuttavia, è importante non limitarsi a effettuare ripetutamente richieste ai server di Google. Questo comportamento di loop può sovraccaricare tra il tuo client e Google, causando problemi a molte parti.

Un approccio migliore è riprovare con un ritardo maggiore tra un tentativo e l'altro. Di solito il ritardo viene aumentato di un fattore moltiplicativo a ogni tentativo, un approccio noto Backoff esponenziale.

Ad esempio, consideriamo un'applicazione che vuole effettuare questa richiesta l'API Time Zone:

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

Il seguente esempio Python 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}")

Devi inoltre fare attenzione che la chiamata all'applicazione non includa un nuovo codice per un nuovo tentativo che porta a richieste ripetute in rapida successione.

Richieste sincronizzate

Un numero elevato di richieste sincronizzate alle API di Google può apparire come Attacco DoS (Denial of Service) all'infrastruttura di Google e da trattare di conseguenza. A evita questo, devi assicurarti che le richieste API non siano sincronizzate tra i clienti.

Ad esempio, considera un'applicazione che mostra l'ora nel fuso orario attuale. Questa applicazione probabilmente imposterà un allarme nel sistema operativo client per riattivarlo alle l'inizio del minuto in modo che l'ora visualizzata possa essere aggiornata. L'applicazione dovrebbe non effettuare chiamate API nell'ambito dell'elaborazione associata a questo allarme.

Effettuare chiamate API in risposta a un allarme fisso è un'azione negativa perché le chiamate API vengono sincronizzati all'inizio, anche tra dispositivi diversi, invece di essere distribuiti in modo uniforme nel tempo. Un'applicazione progettata in modo scorretto produrrà un picco di il traffico a livelli sessanta volte normali all'inizio di ogni minuto.

Un'ottima soluzione potrebbe essere quella di impostare una seconda sveglia su un orario selezionato in modo casuale. Quando questo secondo allarme si attiva, l'applicazione chiama tutte le API di cui ha bisogno e memorizza che consentono di analizzare i dati e visualizzare i risultati. Quando l'applicazione vuole aggiornare il proprio display all'inizio del minuto, usa a risultati archiviati in precedenza anziché chiamare di nuovo l'API. Con questo approccio, le chiamate API sono distribuiti in modo uniforme nel tempo. Inoltre, le chiamate API non ritardano il rendering quando il display viene in fase di aggiornamento.

Oltre all'inizio del minuto, altri orari di sincronizzazione comuni devono essere non scelti come target sono all'inizio di un'ora e all'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 capire, ma non proprio facile da usare. Quando esegui una query, piuttosto che visualizzare un set di dati, probabilmente vorrai estrarre alcuni e i relativi valori. In genere, è consigliabile analizzare le risposte provenienti dal web servizio ed estrarre solo i valori che ti interessano.

Lo schema di analisi utilizzato dipende dal fatto che tu stia restituendo l'output in JSON. Risposte JSON, che sono già sotto forma di Oggetti JavaScript, possono essere elaborati all'interno di JavaScript sul cliente.