node.js - простые http-запросы со сжатием gzip / deflate - PullRequest
45 голосов
/ 16 января 2012

Я пытаюсь выяснить, как лучше всего отправлять запросы HTTP / HTTPS и обрабатывать сжатые ответы gzip / deflate вместе с файлами cookie.

Лучшее, что я нашел, было https://github.com/mikeal/requestкоторый обрабатывает все , кроме сжатия.Есть ли модуль или метод, который будет делать все, что я спрашиваю?

Если нет, могу ли я каким-то образом объединить запрос и zlib?Я попытался объединить zlib и http.ServerRequest, и он с треском провалился.

Спасибо!

Ответы [ 5 ]

91 голосов
/ 18 февраля 2015

Для тех, кто сталкивался с этим в последнее время, библиотека запросов теперь поддерживает распаковку gzip из коробки. Используйте следующим образом:

request(
    { method: 'GET'
    , uri: 'http://www.google.com'
    , gzip: true
    }
  , function (error, response, body) {
      // body is the decompressed response body
      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
      console.log('the decoded data is: ' + body)
    }
  )

Из чтения github https://github.com/request/request

gzip - если true, добавьте заголовок Accept-Encoding для запроса сжатого кодирование контента с сервера (если его еще нет) и декодирование поддерживаются кодировки контента в ответе. Примечание: автоматическое декодирование содержимого ответа выполняется на данных тела, возвращаемых через запрос (как через поток запросов, так и переданный в обратный вызов функция), но не выполняется в потоке ответа (доступно из ответное событие), которое является неизмененным http.IncomingMessage объект, который может содержать сжатые данные. Смотрите пример ниже.

70 голосов
/ 07 февраля 2013

Примечание: по состоянию на 2019 г. в запрос встроена распаковка gzip. Вы по-прежнему можете распаковывать запросы вручную, используя следующий метод.

Вы можете просто объединить request и zlib с потоками.

Вот пример, предполагающий, что сервер прослушивает порт 8000:

var request = require('request'), zlib = require('zlib');

var headers = {
    'Accept-Encoding': 'gzip'
};

request({url:'http://localhost:8000/', 'headers': headers})
    .pipe(zlib.createGunzip()) // unzip
    .pipe(process.stdout); // do whatever you want with the stream
6 голосов
/ 21 февраля 2013

Вот рабочий пример, который стреляет в ответ

function gunzipJSON(response){

    var gunzip = zlib.createGunzip();
    var json = "";

    gunzip.on('data', function(data){
        json += data.toString();
    });

    gunzip.on('end', function(){
        parseJSON(json);
    });

    response.pipe(gunzip);
}

Полный код: https://gist.github.com/0xPr0xy/5002984

3 голосов
/ 18 февраля 2012

Ознакомьтесь с примерами на http://nodejs.org/docs/v0.6.0/api/zlib.html#examples

zlib теперь встроен в узел.

1 голос
/ 28 мая 2015

Заглянув внутрь исходного кода - вы должны установить параметр gzip в самой библиотеке запросов для работы gzip.Не уверен, было ли это намеренным или нет, но это текущая реализация.Никаких дополнительных заголовков не требуется.

var request = require('request');
request.gzip = true;
request({url: 'https://...'},  // use encoding:null for buffer instead of UTF8
    function(error, response, body) { ... }
);
...