Este documento aborda algumas técnicas que você pode usar para melhorar o desempenho do aplicativo. Em alguns casos, exemplos de outras APIs ou de APIs genéricas são usados para ilustrar as ideias apresentadas. No entanto, os mesmos conceitos são aplicáveis à API Google Sheets.
Compactação com o gzip
Uma maneira fácil e conveniente de reduzir a largura de banda necessária a cada solicitação é ativar a compactação gzip. Embora isso exija mais tempo de CPU para descompactar os resultados, a redução dos custos de rede normalmente faz com que esse método valha muito a pena.
Para receber uma resposta codificada em gzip, é preciso definir um cabeçalho Accept-Encoding e modificar seu user agent para conter a string gzip. Veja um exemplo de cabeçalhos HTTP formados devidamente para permitir a compactação gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Como trabalhar com recursos parciais
Outra forma de melhorar o desempenho das chamadas de API é solicitar apenas a parte dos dados do seu interesse. Assim, evita-se a transferência, a análise e o armazenamento de campos desnecessários no aplicativo para que recursos como rede, CPU e memória sejam usados de maneira mais eficiente.
Resposta parcial
Por padrão, depois de processar as solicitações, o servidor envia de volta a representação completa de um recurso. Para melhorar o desempenho, solicite ao servidor o envio apenas dos campos realmente necessários para receber uma resposta parcial.
Para solicitar uma resposta parcial, use o parâmetro de solicitação fields para especificar os campos a serem retornados. Use esse parâmetro com qualquer solicitação que retorne dados de resposta.
Exemplo
O exemplo a seguir mostra o uso do parâmetro fields com uma API "Demo" genérica (fictícia).
Solicitação simples: essa solicitação HTTP GET omite o parâmetro fields e retorna o recurso completo.
https://www.googleapis.com/demo/v1
Resposta de recursos completos: os dados de recursos completos incluem os campos a seguir, além de muitos outros omitidos para agilizar o processo.
{
"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",
...
},
...
]
}Solicitação de uma resposta parcial: na solicitação a seguir, para esse mesmo recurso, o parâmetro fields é usado para reduzir de modo significativo a quantidade de dados retornados.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Resposta parcial: em reação à solicitação acima, o servidor envia de volta uma resposta que contém somente as informações de tipo, além de uma matriz de itens pareados com características de tamanho e título HTML em cada item.
200 OK
{
"kind": "demo",
"items": [{
"title": "First title",
"characteristics": {
"length": "short"
}
}, {
"title": "Second title",
"characteristics": {
"length": "long"
}
},
...
]
}A resposta é um objeto JSON que contém apenas os campos selecionados e os respectivos objetos pais.
Os detalhes sobre como formatar o parâmetro fields são abordados a seguir. Depois há mais informações sobre os elementos retornados na resposta.
Resumo da sintaxe do parâmetro fields
O formato do valor do parâmetro da solicitação fields baseia-se vagamente na sintaxe XPath. Veja abaixo um resumo da sintaxe compatível e outros exemplos.
- Use uma lista separada por vírgulas para selecionar vários campos.
- Use
a/bpara selecionar um campobaninhado no campoa. Usea/b/cpara selecionar um campocaninhado emb.
Exceção: Para respostas da API que usam wrappers "data", em que a resposta é aninhada em um objeto
datasemelhante adata: { ... }, não inclua "data" na especificaçãofields. A inclusão do objeto de dados com uma especificação de campos comodata/a/bcausa um erro. Em vez disso, basta usar uma especificaçãofieldscomoa/b. - Use um subseletor para solicitar um conjunto de subcampos específicos de matrizes ou objetos colocando as expressões entre parênteses:
( ).Por exemplo:
fields=items(id,author/email)retorna apenas o ID do item e o e-mail do autor para cada elemento na matriz de itens. Também é possível especificar um único subcampo, em quefields=items(id)é equivalente afields=items/id. - Se necessário, use caracteres curinga em seleções de campo.
Por exemplo:
fields=items/pagemap/*seleciona todos os objetos em um pagemap.
Mais exemplos do uso do parâmetro fields
Os exemplos abaixo incluem descrições de como o valor do parâmetro fields afeta a resposta.
Observação: assim como com todos os valores de parâmetro de consulta, fields também precisa ter codificação de URL. Para facilitar a leitura, os exemplos neste documento estão sem a codificação.
- Identifique os campos a serem retornados ou faça seleções de campos.
- O valor de parâmetro da solicitação
fieldsé uma lista de campos separados por vírgulas e cada campo é especificado em relação à raiz da resposta. Portanto, se você estiver executando uma operação de lista, a resposta será uma coleção que, geralmente, inclui uma matriz de recursos. Se você estiver executando uma operação que retorne um único recurso, os campos serão especificados em relação a esse recurso. Se o campo selecionado for uma matriz, ou parte dela, o servidor retornará a parte selecionada de todos os elementos na matriz.
Veja alguns exemplos do nível de coleção:
Exemplos Efeito itemsRetorna todos os elementos da matriz de itens, incluindo todos os campos em cada elemento, mas nenhum outro campo. etag,itemsRetorna o campo etage todos os elementos na matriz de itens.items/titleRetorna apenas o campo de titlepara todos os elementos da matriz de itens.
Sempre que um campo aninhado for retornado, a resposta incluirá os respectivos objetos pais. Os campos pai não incluem outro campo filho, a menos que eles também sejam selecionados explicitamente.context/facets/labelRetorna apenas o campo labelpara todos os membros da matrizfacets, que é aninhada sob o objetocontext.items/pagemap/*/titlePara cada elemento na matriz de itens, retorna apenas o campo title, se presente, de todos os objetos filhos depagemap.
Veja alguns exemplos no nível do recurso:
Exemplos Efeito titleRetorna o campo titledo recurso solicitado.author/uriRetorna o subcampo urido objetoauthorno recurso solicitado.links/*/hrefRetorna o campo hrefde todos os objetos filhos delinks. - Solicite apenas partes de campos específicos usando subseleções.
- Por padrão, se houver campos especificados na solicitação, todos os objetos ou elementos da matriz serão retornados pelo servidor. É possível especificar uma resposta que inclua apenas alguns subcampos. Para isso, use a sintaxe de subseleção "
( )", como no exemplo abaixo.Exemplo Efeito items(title,author/uri)Retorna apenas os valores de titleeurido autor para cada elemento na matriz de itens.
Como processar respostas parciais
Depois que o servidor processar uma solicitação válida que inclua o parâmetro de consulta fields, ele retorna um código de status 200 OK HTTP, junto com os dados solicitados. Se o parâmetro de consulta fields tiver um erro ou for inválido, o servidor retornará um código de status HTTP 400 Bad Request com uma mensagem informando ao usuário o que havia de errado com a seleção de campos. Por exemplo, "Invalid field selection a/b".
Veja o exemplo da resposta parcial apresentado na seção introdutória acima. A solicitação usa o parâmetro fields para especificar os campos que precisam ser retornados.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
A resposta parcial tem esta aparência:
200 OK
{
"kind": "demo",
"items": [{
"title": "First title",
"characteristics": {
"length": "short"
}
}, {
"title": "Second title",
"characteristics": {
"length": "long"
}
},
...
]
}Observação: em APIs compatíveis com 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 administrável. Caso contrário, os possíveis ganhos de desempenho talvez não se concretizem.