En este documento se tratan algunas técnicas que puedes usar para mejorar el rendimiento de una aplicación. En algunos casos, se usan ejemplos de otras APIs o APIs genéricas para ilustrar las ideas presentadas. Sin embargo, se pueden aplicar los mismos conceptos a la API Resource Manager.
Compresión usando gzip
Una forma sencilla y cómoda de reducir el ancho de banda que se necesita en cada solicitud consiste en habilitar la compresión gzip. Aunque este método requiere tiempo de CPU adicional para descomprimir los resultados, la compensación con la reducción de los costes de red normalmente hace que merezca la pena.
Para recibir una respuesta con codificación gzip debes hacer dos cosas: añadir un encabezado Accept-Encoding
y modificar el user-agent para que incluya la cadena gzip
. A continuación, te 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 la representación completa de un recurso después de procesar las solicitudes. Para lograr el mejor rendimiento, en lugar de eso puedes pedir al servidor que envíe solamente los campos que realmente necesita y obtener una respuesta parcial.
Si quieres solicitar una respuesta parcial, usa el parámetro de solicitud fields
para especificar los campos que quieres 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 Demo genérica (ficticia).
Solicitud simple: esta solicitud GET
de HTTP omite el parámetro fields
y devuelve el recurso completo.
https://www.googleapis.com/demo/v1
Respuesta completa del recurso: entre la información completa del recurso se incluyen los siguientes campos (muchos otros se han omitido por 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 de este mismo recurso utiliza el parámetro fields
para reducir considerablemente la cantidad de datos devueltos.
https://www.googleapis.com/demo/v1?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 explican los detalles sobre 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 libremente en la sintaxis XPath. A continuación se resume la sintaxis compatible y, en la siguiente sección, se proporcionan más ejemplos:
- Usa una lista separada por comas para seleccionar varios campos.
- Usa
a/b
para seleccionar un campob
que esté anidado en el campoa
. Usaa/b/c
para seleccionar un campoc
anidado enb
.
Excepción: En el caso de las respuestas de APIs que utilizan envoltorios "data", en las que la respuesta está anidada en un objeto
data
similar adata: { ... }
, no incluyas "data
" en la especificaciónfields
. Si se incluye un objeto de datos en el que el valordata/a/b
se haya especificado como parámetro fields, se producirá un error. En su lugar, como el parámetrofields
especifica el valora/b
. - Utiliza un subselector para solicitar un conjunto de subcampos específicos de matrices u objetos. Para ello, incluye 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 subcampo, 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 se muestran a continuación se incluyen las descripciones de cómo afecta el valor del parámetro fields
a la respuesta.
Nota: Al igual que ocurre con todos los valores del parámetro de consulta, el valor del parámetro fields
debe ser una URL codificada. Para facilitar la lectura, los ejemplos de este documento omiten la codificación.
- Identifica los campos que quieras 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 ejecutas una operación que devuelve un único recurso, se especifican los campos en relación con ese recurso. pero si el campo que selecciona es (o forma parte de) una matriz, el servidor devuelve la parte seleccionada de todos los elementos de la matriz.
A continuación te mostramos algunos ejemplos a nivel de colección:
Ejemplos Efecto items
Devuelve todos los elementos de la matriz de elementos, 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 de elementos.items/title
Devuelve solo el campo title
de todos los elementos de la matriz de elementos.
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 solo el campo label
por todos los miembros de la matrizfacets
, que está anidada en el objetocontext
.items/pagemap/*/title
Por cada elemento de la matriz de elementos, devuelve únicamente el campo title
(si está) de todos los objetos secundarios depagemap
.
A continuación, te mostramos algunos ejemplos a nivel de recurso:
Ejemplos Efecto title
Devuelve el campo title
del recurso solicitado.author/uri
Devuelve el subcampo uri
del objetoauthor
del 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 en tu solicitud se especifican campos concretos, el servidor devuelve los objetos o los elementos de la matriz en su totalidad. Puedes especificar una respuesta que incluya únicamente determinados subcampos. 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 del title
y deluri
del autor por cada elemento de la matriz de elementos.
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 el 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?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: Con las APIs que admiten parámetros de consulta en la paginación de datos (maxResults
y nextPageToken
, por ejemplo), utiliza estos parámetros para reducir los resultados de cada consulta de forma que puedan procesarse fácilmente. De lo contrario, podrían no obtenerse los beneficios de rendimiento que se conseguirían con la respuesta parcial.