Respuestas de error estándar
Si una solicitud de la API de gestión de cuentas se realiza correctamente, la API devuelve el código de estado 200
. Si se produce un error en una solicitud, la API devuelve un código de estado HTTP y un motivo en la respuesta según el tipo de error.
Además, el cuerpo de la respuesta contiene una descripción detallada de lo que ha provocado el error. A continuación se presenta un ejemplo de una respuesta de error:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]",
"locationType": "parameter",
"location": "max-results"
}
],
"code": 400,
"message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]"
}
}
Tabla de errores
Código | Motivo | Descripción | Acción recomendada |
---|---|---|---|
400 | invalidParameter |
Indica que un parámetro de solicitud tiene un valor no válido. En los campos locationType y location de la respuesta de error se proporciona información sobre dicho valor. |
No vuelvas a intentar la acción sin antes corregir el problema. Debes proporcionar un valor válido para el parámetro especificado en la respuesta de error. |
400 | badRequest |
Indica que la consulta no es válida. Por ejemplo, falta el ID superior o bien la combinación de dimensiones o métricas solicitadas no es válida. | No vuelvas a intentar la acción sin antes corregir el problema. Debes realizar cambios en la consulta de la API para que funcione. |
401 | invalidCredentials |
Indica que el token de autenticación no es válido o ha caducado. | No vuelvas a intentar la acción sin antes corregir el problema. Debes obtener un nuevo token de autenticación. |
403 | insufficientPermissions |
Indica que el usuario no tiene suficientes permisos para la entidad especificada en la consulta. | No vuelvas a intentar la acción sin antes corregir el problema. Debes obtener permisos suficientes para realizar la operación en la entidad especificada. |
403 | dailyLimitExceeded |
Indica que el usuario ha superado la cuota diaria (por proyecto o por vista [perfil]). | No vuelvas a intentar la acción sin antes corregir el problema. Has agotado tu cuota diaria. Consulta Límites y cuotas en las solicitudes de API. |
403 | userRateLimitExceeded |
Indica que se ha superado el límite de Consultas por usuario por cada 100 segundos. El valor predeterminado en la consola de APIs de Google es de 100 consultas cada 100 segundos por usuario. Puedes aumentar este límite de la consola hasta un máximo de 1000. | Vuelve a intentarlo con un retardo exponencial. Debes reducir la frecuencia con la que envías las solicitudes. |
403 | rateLimitExceeded |
Indica que se han superado los límites de frecuencia de consultas por cada 100 segundos del proyecto. | Vuelve a intentarlo con un retardo exponencial. Debes reducir la frecuencia con la que envías las solicitudes. |
403 | quotaExceeded |
Indica que se han alcanzado las 10 solicitudes simultáneas por vista (perfil) en la API de informes centrales. | Vuelve a intentarlo con un retardo exponencial. Debes esperar a que termine al menos una solicitud en curso correspondiente a esta vista (perfil). |
500 | internalServerError |
Se ha producido un error interno inesperado del servidor. | No reintentes esta consulta más de una vez. |
503 | backendError |
El servidor ha devuelto un error. | No vuelvas a intentar esta consulta más de una vez. |
Gestionar respuestas 500 o 503
Se pueden producir errores 500
o 503
por cargas intensas de trabajo o por solicitudes complejas y grandes. Si las solicitudes son grandes, te recomendamos que solicites los datos de un periodo de tiempo más corto. Asimismo, puedes implementar un retardo exponencial.
La frecuencia de estos errores puede depender de la vista (perfil) y la cantidad de datos asociados a ella. Una consulta que devuelva un error 500
o 503
para una determinada vista (perfil) no necesariamente devolverá el mismo error para otra vista (perfil).
Implementar un retardo exponencial
El retardo exponencial es el proceso de un cliente que reintenta periódicamente una solicitud con error durante un periodo que se va incrementando. Se trata de una estrategia de gestión de errores estándar para las aplicaciones de red. La API de creación de cuentas se ha diseñado con la expectativa de que los clientes que deciden reintentar las solicitudes con error lo hagan con un retardo exponencial. Además de ser "obligatorio", el uso del retardo exponencial aumenta la eficiencia del uso del ancho de banda, reduce el número de solicitudes necesarias para obtener una respuesta correcta y maximiza el rendimiento de las solicitudes en entornos simultáneos.
A continuación se indica el flujo para implementar el retardo exponencial simple.
- Realizar una solicitud a la API
- Recibir una respuesta de error que tenga un código de error que se pueda recuperar
- Esperar un 1 segundo más
random_number_milliseconds
segundos. - Reintentar la solicitud
- Recibir una respuesta de error que tenga un código de error que se pueda recuperar
- Esperar dos segundos más
número_aleatorio_de_milisegundos
segundos - Reintentar la solicitud
- Recibir una respuesta de error que tenga un código de error que se pueda recuperar
- Esperar cuatro segundos más
número_aleatorio_de_milisegundos
segundos - Reintentar la solicitud
- Recibir una respuesta de error que tenga un código de error que se pueda recuperar
- Esperar ocho segundos más
número_aleatorio_de_milisegundos
segundos - Reintentar la solicitud
- Recibir una respuesta de error que tenga un código de error que se pueda recuperar
- Esperar dieciséis segundos más
número_aleatorio_de_milisegundos
segundos - Reintentar la solicitud
- Si se sigue obteniendo un error, detener la solicitud y registrar el error.
En el flujo anterior, número_aleatorio_de_milisegundos
es un número menor o igual que 1000. Esto es necesario para evitar determinados errores de bloqueo en algunas implementaciones simultáneas.
El valor de random_number_milliseconds
debe volverse a definir después de cada espera.
Nota: La espera siempre es (2 ^ n) + número_aleatorio_de_milisegundos
, donde n es un entero que se incrementa monotónicamente definido inicialmente como 0. El valor de n se incrementa en 1 en cada iteración (cada solicitud).
El algoritmo está configurado para terminar cuando n es 5. Este límite solo se aplica para impedir que los clientes vuelvan a intentar la operación indefinidamente. El resultado es un retardo total de 32 segundos antes de que una solicitud se considere "un error irrecuperable".
El siguiente código Python es una implementación del flujo anterior para restablecer la solicitud tras los errores que se producen en un método denominado makeRequest
.
import random import time from apiclient.errors import HttpError def makeRequestWithExponentialBackoff(analytics): """Wrapper to request Google Analytics data with exponential backoff. The makeRequest method accepts the analytics service object, makes API requests and returns the response. If any error occurs, the makeRequest method is retried using exponential backoff. Args: analytics: The analytics service object Returns: The API response from the makeRequest method. """ for n in range(0, 5): try: return makeRequest(analytics) except HttpError, error: if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded', 'internalServerError', 'backendError']: time.sleep((2 ** n) + random.random()) else: break print "There has been an error, the request never succeeded."