Como enviar uma resposta json gzipada do Google Cloud Functions?

Minhas respostas JSON em uma das minhas funções do Google Cloud podem ser reduzidas em até 70-80% em tamanho se eu responder usando a compactação gzip.

Como posso enviar uma resposta json compactada de minhas funções (triggersr via http (s))?

Isso também significaria economizar muitas despesas de rede com a plataforma de nuvem do Google e um carregamento mais rápido dos dados para os consumidores móveis dos dados.

Eu tentei usar o módulo nativo do zlib mas sem sorte …

 if (req.get('Accept-Encoding') && req.get('Accept-Encoding').indexOf('gzip') > -1) { interpretation.gzip = true; const zlib = require('zlib'); res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); zlib.gzip(JSON.stringify(interpretation), function (error, result) { if (error) throw error; res.status(200).send(result); }) } else { interpretation.gzip = false; res.status(200).send(interpretation); } 

Em Postman, o tamanho da resposta é o mesmo, o tipo de conteúdo foi alterado, mas não há nenhum header Content-Encoding definido na resposta …

No topo (fundo branco) estão os cabeçalhos do meu pedido. Funciona bem e o cabeçalho é recebido pelo meu aplicativo. Os cabeçalhos de resposta perdem meu Content-Encoding.

Veja as Perguntas frequentes sobre o App Engine , especificamente a resposta para a pergunta ” Como posso exibir conteúdo compactado? “:

…. Para forçar o conteúdo gzipado a ser exibido, os clientes podem fornecer ‘gzip’ como o valor dos headers de solicitação Accept-Encoding e User-Agent . O conteúdo nunca será gzipado se nenhum header Accept-Encoding estiver presente …

Além disso, neste post de grupo, há um exemplo de como enviar uma solicitação com o Cloud Functions usando a combinação Accept-Encoding , User-Agent :

 curl -v "https://us-central1-.cloudfunctions.net/test" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" -H "Accept-Encoding: gzip" 

Provavelmente você pode tentar usar o módulo zlib para manipular a compactação e definir uma codificação apropriada para a resposta:

 exports.helloWorld = function helloWorld(req, res) { const zlib = require('zlib'); // Obtain JSON stream from your source... res.status(200); res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); json.pipe(zlib.createGzip()).pipe(res); }; 

Naturalmente, é necessário primeiro verificar se o cliente aceita o gzip . Além disso, o uso da codificação zlib pode ser caro e os resultados devem ser armazenados em cache.

    Intereting Posts