Los servicios web de Google Maps Platform son una colección de interfaces HTTP a los servicios de Google que proporcionan datos geográficos para tus aplicaciones de mapas.
En esta guía, se describen algunas prácticas comunes útiles para configurar tus solicitudes de servicio web y procesar las respuestas del servicio. Consulta la guía para desarrolladores para obtener la documentación completa de la API de Geolocation.
¿Qué es un servicio web?
Los servicios web de Google Maps Platform son una interfaz para solicitar datos de la API de Maps desde servicios externos y usar los datos en tus aplicaciones de Maps. Estos servicios están diseñados para usarse junto con un mapa, de conformidad con las Restricciones de Licencia de las Condiciones del Servicio de Google Maps Platform.
Los servicios web de las APIs de Maps usan solicitudes HTTP(S) a URLs específicas y pasan parámetros de URL o datos POST en formato JSON como argumentos a los servicios. Por lo general, estos servicios muestran datos en el cuerpo de la respuesta como JSON para que tu aplicación los analice o procese.
Las solicitudes de geolocalización se envían usando POST a la siguiente dirección URL:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
Nota: Todas las aplicaciones de la API de Geolocation requieren autenticación. Obtén más información sobre las credenciales de autenticación.
Acceso a SSL/TLS
HTTPS es obligatorio para todas las solicitudes de Google Maps Platform que usan claves de API o contienen datos del usuario. Es posible que se rechacen las solicitudes realizadas a través de HTTP que contengan datos sensibles.
Uso normal de las API de Google
Los clientes de API mal diseñados pueden generar más carga de la necesaria en Internet y en los servidores de Google. En esta sección se explican algunas de las prácticas recomendadas para los clientes de las API. Seguir estas prácticas recomendadas puede ayudarte a evitar que se bloquee tu aplicación por un abuso involuntario de las APIs.
Interrupción exponencial
En casos excepcionales, es posible que se produzca un error cuando se envíe tu solicitud. Es posible que recibas un código de respuesta HTTP 4XX o 5XX, o que la conexión TCP falle en algún punto entre tu cliente y el servidor de Google. A menudo, vale la pena volver a intentar la solicitud, ya que la solicitud de seguimiento puede tener éxito cuando la original falló. Sin embargo, es importante no realizar solicitudes a los servidores de Google de forma repetida. Este comportamiento de bucle puede sobrecargar la red entre tu cliente y Google, lo que causa problemas para muchas partes.
Un mejor enfoque consiste en realizar nuevos intentos con demoras más prolongadas entre uno y otro. Por lo general, la demora aumenta en un factor multiplicativo con cada intento, un enfoque conocido como retirada exponencial.
Por ejemplo, considera una aplicación que desea realizar esta solicitud a la API de Time Zone:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEY
En el siguiente ejemplo de Python se muestra la manera de realizar la solicitud con interrupción exponencial:
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}")
También debes tener cuidado de que no haya un código de reintento más alto en la cadena de llamadas de la aplicación que genere solicitudes repetidas en rápida sucesión.
Solicitudes sincronizadas
Grandes cantidades de solicitudes sincronizadas a las APIs de Google pueden parecer un ataque de denegación de servicio distribuido (DDoS) en la infraestructura de Google y tratarse de esa manera. Para evitar esto, debes asegurarte de que las solicitudes a la API no se sincronicen entre los clientes.
Por ejemplo, considera una aplicación que muestre la hora en la zona horaria actual. Es probable que esta aplicación establezca una alarma en el sistema operativo del cliente para activarlo al comienzo del minuto, de modo que se pueda actualizar la hora que se muestra. La aplicación no debe realizar ninguna llamada a la API como parte del procesamiento asociado con esa alarma.
No es recomendable realizar llamadas a la API en respuesta a una alarma fija, ya que esto hace que las llamadas a la API se sincronicen al comienzo del minuto, incluso entre diferentes dispositivos, en lugar de distribuirse de manera uniforme a lo largo del tiempo. Una aplicación mal diseñada que haga esto producirá un aumento repentino del tráfico sesenta veces superior al nivel normal al comienzo de cada minuto.
En su lugar, un posible buen diseño es tener una segunda alarma configurada en una hora elegida al azar. Cuando se activa esta segunda alarma, la aplicación llama a las APIs que necesita y almacena los resultados. Cuando la aplicación quiere actualizar su visualización al comienzo del minuto, usa los resultados almacenados anteriormente en lugar de volver a llamar a la API. Con este enfoque, las llamadas a la API se distribuyen de manera uniforme a lo largo del tiempo. Además, las llamadas a la API no retrasan la renderización cuando se actualiza la pantalla.
Además del inicio del minuto, otros momentos de sincronización comunes que debes tener cuidado de no segmentar son el inicio de una hora y el inicio de cada día a la medianoche.
Procesamiento de respuestas
En esta sección se discute cómo extraer esos valores de forma dinámica de las respuestas de los servicios web.
Los servicios web de Google Maps proporcionan respuestas fáciles de entender, pero no son del todo fáciles de usar. Cuando realizas una consulta, en lugar de mostrar un conjunto de datos, es probable que desees extraer algunos valores específicos. Por lo general, querrás analizar las respuestas del servicio web y extraer solo los valores que te interesan.
El esquema de análisis que uses dependerá de si devuelves un resultado en JSON. Las respuestas JSON, que ya están en forma de objetos de JavaScript, se pueden procesar dentro de JavaScript en el cliente.