Este documento aborda algumas técnicas que pode usar para melhorar o desempenho da sua aplicação. Em alguns casos, são usados exemplos de outras APIs ou APIs genéricas para ilustrar as ideias apresentadas. No entanto, os mesmos conceitos são aplicáveis à API Resource Manager.
Compressão com gzip
Uma forma fácil e conveniente de reduzir a largura de banda necessária para cada pedido é ativar a compressão gzip. Embora isto exija tempo adicional da CPU para descomprimir os resultados, a compensação com os custos de rede torna-o geralmente muito vantajoso.
Para receber uma resposta com codificação gzip, tem de fazer duas coisas: definir um cabeçalho Accept-Encoding
e modificar o seu agente do utilizador para conter a string gzip
. Segue-se um exemplo de cabeçalhos HTTP corretamente formados para ativar a compressão gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Trabalhar com recursos parciais
Outra forma de melhorar o desempenho das suas chamadas API é pedir apenas a parte dos dados que lhe interessa. Isto permite que a sua aplicação evite transferir, analisar e armazenar campos desnecessários, para que possa usar recursos, incluindo rede, CPU e memória, de forma mais eficiente.
Resposta parcial
Por predefinição, o servidor envia de volta a representação completa de um recurso após o processamento de pedidos. Para um melhor desempenho, pode pedir ao servidor que envie apenas os campos de que realmente precisa e, em alternativa, receber uma resposta parcial.
Para pedir uma resposta parcial, use o parâmetro de pedido fields
para especificar os campos que quer que sejam devolvidos. Pode usar este parâmetro com qualquer pedido que devolva dados de resposta.
Exemplo
O exemplo seguinte mostra a utilização do parâmetro fields
com uma API "Demo" genérica (fictícia).
Pedido simples: este pedido HTTP GET
omite o parâmetro fields
e devolve o recurso completo.
https://www.googleapis.com/demo/v1
Resposta de recurso completa: os dados de recursos completos incluem os seguintes campos, juntamente com muitos outros que foram omitidos para simplificar.
{ "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", ... }, ... ] }
Pedido de uma resposta parcial: o seguinte pedido deste mesmo recurso usa o parâmetro fields
para reduzir significativamente a quantidade de dados devolvidos.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Resposta parcial: em resposta ao pedido acima, o servidor envia uma resposta que contém apenas as informações do tipo, juntamente com uma matriz de itens reduzida que inclui apenas o título HTML e as informações das características de comprimento em cada item.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Tenha em atenção que a resposta é um objeto JSON que inclui apenas os campos selecionados e os respetivos objetos principais circundantes.
Os detalhes sobre como formatar o parâmetro fields
são abordados a seguir, seguidos de mais detalhes sobre o que é exatamente devolvido na resposta.
Resumo da sintaxe do parâmetro fields
O formato do valor do parâmetro de pedido fields
baseia-se vagamente na sintaxe XPath. A sintaxe suportada é resumida abaixo e são fornecidos exemplos adicionais na secção seguinte.
- Use uma lista separada por vírgulas para selecionar vários campos.
- Use
a/b
para selecionar um campob
aninhado no campoa
; usea/b/c
para selecionar um campoc
aninhado emb
.
Exceção: para respostas da API que usam wrappers "data", em que a resposta está aninhada num objeto
data
com o aspeto dedata: { ... }
, não inclua "data
" na especificaçãofields
. A inclusão do objeto de dados com uma especificação de campos comodata/a/b
causa um erro. Em alternativa, use apenas uma especificaçãofields
, comoa/b
. - Use um subseletor para pedir um conjunto de subcampos específicos de matrizes ou objetos colocando expressões entre parênteses "
( )
".Por exemplo:
fields=items(id,author/email)
devolve apenas o ID do artigo e o email do autor para cada elemento na matriz de artigos. Também pode especificar um único subcampo, em quefields=items(id)
é equivalente afields=items/id
. - Se necessário, use carateres universais nas seleções de campos.
Por exemplo:
fields=items/pagemap/*
seleciona todos os objetos num mapa de páginas.
Mais exemplos de utilização do parâmetro fields
Os exemplos abaixo incluem descrições de como o valor do parâmetro fields
afeta a resposta.
Nota: tal como acontece com todos os valores dos parâmetros de consulta, o valor do parâmetro fields
tem de ser codificado por URL. Para uma melhor legibilidade, os exemplos neste documento omitem a codificação.
- Identifique os campos que quer que sejam devolvidos ou faça seleções de campos.
- O valor do parâmetro de pedido
fields
é uma lista de campos separados por vírgulas, e cada campo é especificado relativamente à raiz da resposta. Assim, se estiver a realizar uma operação de list, a resposta é uma coleção e, geralmente, inclui uma matriz de recursos. Se estiver a realizar uma operação que devolve um único recurso, os campos são especificados relativamente a esse recurso. Se o campo que selecionar for (ou fizer parte de) uma matriz, o servidor devolve a parte selecionada de todos os elementos na matriz.
Seguem-se alguns exemplos ao nível da recolha:
Exemplos Efeito items
Devolve todos os elementos na matriz de itens, incluindo todos os campos em cada elemento, mas nenhum outro campo. etag,items
Devolve o campo etag
e todos os elementos na matriz de artigos.items/title
Devolve apenas o campo title
para todos os elementos na matriz de artigos.
Sempre que é devolvido um campo aninhado, a resposta inclui os objetos principais circundantes. Os campos principais não incluem outros campos secundários, a menos que também sejam selecionados explicitamente.context/facets/label
Devolve apenas o campo label
para todos os membros da matrizfacets
, que está aninhada no objetocontext
.items/pagemap/*/title
Para cada elemento na matriz de itens, devolve apenas o campo title
(se presente) de todos os objetos que são filhos depagemap
.
Seguem-se alguns exemplos ao nível do recurso:
Exemplos Efeito title
Devolve o campo title
do recurso pedido.author/uri
Devolve o subcampo uri
do objetoauthor
no recurso pedido.links/*/href
Devolve o campo href
de todos os objetos que são filhos delinks
. - Pedir apenas partes de campos específicos através de subseleções.
- Por predefinição, se o seu pedido especificar campos específicos, o servidor devolve os objetos ou os elementos da matriz na sua totalidade. Pode especificar uma resposta que inclua apenas determinados subcampos. Pode fazê-lo através da sintaxe de subseleção "
( )
", como no exemplo abaixo.Exemplo Efeito items(title,author/uri)
Devolve apenas os valores de title
euri
do autor para cada elemento na matriz de artigos.
Processamento de respostas parciais
Depois de um servidor processar um pedido válido que inclua o parâmetro de consulta fields
, envia um código de estado HTTP 200 OK
, juntamente com os dados pedidos. Se o parâmetro de consulta fields
tiver um erro ou for inválido de outra forma, o servidor devolve um código de estado HTTP 400 Bad Request
, juntamente com uma mensagem de erro a indicar ao utilizador o que estava errado com a seleção de campos (por exemplo, "Invalid field selection a/b"
).
Segue-se o exemplo de resposta parcial apresentado na secção introdutória acima. O pedido usa o parâmetro fields
para especificar os campos a devolver.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
A resposta parcial tem o seguinte aspeto:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Nota: para APIs que suportam parâmetros de consulta para paginação de dados (por exemplo, maxResults
e nextPageToken
), use esses parâmetros para reduzir os resultados de cada consulta a um tamanho gerível. Caso contrário, os ganhos de desempenho possíveis com a resposta parcial podem não ser realizados.