En este documento se explican algunas técnicas que puedes usar para mejorar el rendimiento de una aplicación. En algunos casos, se usan ejemplos de otras API o API genéricas para ilustrar las ideas presentadas. Sin embargo, se pueden aplicar los mismos conceptos a la API de Google Analytics.
Usar gzip
Una forma sencilla y cómoda de reducir el ancho de banda necesario para cada solicitud consiste en habilitar la compresión gzip. Aunque esto requiere tiempo de CPU adicional para descomprimir los resultados, la compensación con los costes de red normalmente hace que merezca la pena.
Para recibir una respuesta con codificación gzip debes hacer dos cosas: establecer un encabezado Accept-Encoding
y modificar el user-agent para que incluya la cadena gzip
. A continuación, mostramos un ejemplo de encabezados HTTP con formato correcto para habilitar la compresión gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Trabajar con recursos parciales
Otra forma de mejorar el rendimiento de las llamadas de API es solicitar solo la parte de los datos en la que estés interesado. De este modo tu aplicación no tendrá que transferir, analizar y almacenar campos innecesarios y podrá utilizar recursos como la red, la CPU y la memoria con más eficacia.
Respuesta parcial
De forma predeterminada, el servidor muestra todo un recurso después de procesar las solicitudes. Para lograr el mejor rendimiento, puedes pedir al servidor que envíe solamente los campos que realmente necesitas y obtener en su lugar una respuesta parcial.
Para solicitar una respuesta parcial, usa el parámetro de solicitud fields
para especificar los campos que deseas que se devuelvan. Puedes usar este parámetro con cualquier solicitud que devuelva datos de respuesta.
Ejemplo
En el siguiente ejemplo se muestra el uso del parámetro fields
con una API genérica de demostración (ficticia).
Solicitud simple: esta solicitud GET
de HTTP omite el parámetro fields
y devuelve el recurso completo.
https://www.googleapis.com/demo/v1?key=YOUR-API-KEY
Respuesta completa del recurso: entre la información completa del recurso se incluyen los siguientes campos (muchos otros se han omitido en aras de la brevedad).
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
Solicitud de una respuesta parcial: la solicitud siguiente para este mismo recurso utiliza el parámetro fields
a fin de reducir considerablemente la cantidad de datos devueltos.
https://www.googleapis.com/demo/v1?key=YOUR-API-KEY&fields=kind,items(title,characteristics/length)
Respuesta parcial: en respuesta a la solicitud anterior, el servidor devuelve una respuesta que contiene solamente información sobre el tipo, junto con una matriz reducida de elementos que solo incluye el título en HTML y la información característica de la longitud en cada elemento.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Ten en cuenta que la respuesta es un objeto JSON que incluye solamente los campos seleccionados y los objetos contenedores principales.
A continuación se explica cómo dar formato al parámetro fields
, así como información sobre qué resultados se devuelven exactamente en la respuesta.
Resumen de la sintaxis del parámetro fields
El formato del valor del parámetro de solicitud fields
se basa ligeramente en la sintaxis de XPath. A continuación se resume la sintaxis admitida y, en la siguiente sección, se proporcionan más ejemplos:
- Utiliza una lista separada por comas para seleccionar varios campos.
- Usa
a/b
para seleccionar un campob
anidado en el campoa
; usaa/b/c
para seleccionar un campoc
anidado enb
.
Excepción: Para las respuestas de API que usen contenedores "data", donde la respuesta está anidada en un objeto
data
similar adata: { ... }
, no incluyas "data
" en la especificaciónfields
. La inclusión del objeto de datos con una especificación de fields comodata/a/b
provoca un error. En su lugar, usa solamente una especificación defields
comoa/b
. - Utiliza un selector secundario para solicitar un conjunto de campos secundarios específicos de matrices o de objetos, incluidas las expresiones entre paréntesis "
( )
".Por ejemplo,
fields=items(id,author/email)
devuelve solamente el ID del elemento y el correo electrónico del autor de cada elemento en la matriz de elementos. También puedes especificar un único campo secundario, dondefields=items(id)
equivale afields=items/id
. - Usa comodines en las selecciones de campos, si fuera necesario.
Por ejemplo,
fields=items/pagemap/*
selecciona todos los objetos de un mapa de páginas.
Más ejemplos de uso del parámetro fields
En los ejemplos que pueden verse a continuación se incluyen las descripciones de cómo afecta el valor del parámetro fields
a la respuesta.
Nota: Al igual que sucede con todos los valores de parámetro de consulta, el valor de parámetro fields
debe estar codificado para URL. Para facilitar la lectura, los ejemplos de este documento omiten la codificación.
- Identifica los campos que desees que devuelvan un valor o haz selecciones de campos.
- El valor del parámetro de solicitud
fields
es una lista de campos separados por comas, en la que cada campo se especifica en relación con la raíz de la respuesta. De este modo, si ejecutas una operación de lista, la respuesta es una colección y por lo general incluye una matriz de recursos. Si realizas una operación que devuelve un único recurso, se especifican los campos en relación con ese recurso, pero si el campo que seleccionas es una matriz (o forma parte de ella), el servidor devuelve la parte seleccionada de todos los elementos de la matriz.
A continuación se muestran algunos ejemplos a nivel de colección:
Ejemplos Efecto items
Devuelve todos los elementos de la matriz items, incluidos todos los campos de cada elemento, pero no el resto de campos. etag,items
Devuelve el campo etag
y todos los elementos de la matriz items.items/title
Devuelve solo el campo title
de todos los elementos de la matriz items.
Siempre que se devuelve un campo anidado, la respuesta incluye los objetos contenedores principales. Los campos principales no incluyen otros campos secundarios, salvo que también se hayan seleccionado de forma explícita.context/facets/label
Devuelve únicamente el campo label
para todos los miembros de la matrizfacets
, que está anidada en el objetocontext
.items/pagemap/*/title
Por cada elemento de la matriz items, devuelve únicamente el campo title
(si está) de todos los objetos secundarios depagemap
.
A continuación, se ofrecen algunos ejemplos de recurso:
Ejemplos Efecto title
Devuelve el campo title
del recurso solicitado.author/uri
Devuelve el campo secundario uri
del objetoauthor
en el recurso solicitado.links/*/href
Devuelve el campo href
de todos los objetos secundarios delinks
. - Solicita solamente partes de campos concretos mediante subselecciones.
- De forma predeterminada, si tu solicitud especifica determinados campos, el servidor devuelve los objetos o los elementos de matriz en su totalidad. Puedes especificar una respuesta que incluya únicamente determinados campos secundarios. Puedes hacerlo mediante la sintaxis de selección secundaria "
( )
", tal como se muestra en el ejemplo siguiente.Ejemplo Efecto items(title,author/uri)
Devuelve únicamente los valores de title
yuri
del autor por cada elemento de la matriz items.
Gestionar respuestas parciales
Después de que un servidor procese una solicitud válida que incluya el parámetro de consulta fields
, devuelve un código de estado HTTP 200 OK
junto con los datos solicitados. Si el parámetro de consulta fields
presenta un error o no es válido, el servidor devuelve un código de estado 400 Bad Request
de HTTP, junto con un mensaje de error que indica qué fallaba en la selección de los campos (por ejemplo, "Invalid field selection a/b"
).
A continuación, se muestra un ejemplo de respuesta parcial que aparece arriba, en la sección de introducción. La solicitud usa el parámetro fields
para especificar qué campos tiene que devolver.
https://www.googleapis.com/demo/v1?key=YOUR-API-KEY&fields=kind,items(title,characteristics/length)
La respuesta parcial tiene este aspecto:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Nota: Para las API que admiten parámetros de consulta para la paginación de datos (maxResults
y nextPageToken
, por ejemplo), utiliza estos parámetros para reducir los resultados de cada consulta y obtener así un tamaño que se pueda manejar. De lo contrario, podrían no obtenerse los beneficios de rendimiento que se conseguirían con la respuesta parcial.