Uncompress Content-Encoding: gzip с javascript / node [duplicate]

Это просто обнаружение изменений в Angular2 при работе, вызывающее loadProperty(i,element) снова и снова в каждом цикле обнаружения изменений.

Методы вызова из шаблона обескуражены, потому что они вызываются очень часто. Вместо этого вы должны сохранить результат в свойстве и привязать его к этому свойству.

51
задан Alexis Tyler 27 November 2015 в 07:39
поделиться

9 ответов

Я тоже не мог получить запрос на работу, поэтому вместо этого использовал http.

var http = require("http"),
    zlib = require("zlib");

function getGzipped(url, callback) {
    // buffer to store the streamed decompression
    var buffer = [];

    http.get(url, function(res) {
        // pipe the response into the gunzip to decompress
        var gunzip = zlib.createGunzip();            
        res.pipe(gunzip);

        gunzip.on('data', function(data) {
            // decompression chunk ready, add it to the buffer
            buffer.push(data.toString())

        }).on("end", function() {
            // response and decompression complete, join the buffer and return
            callback(null, buffer.join("")); 

        }).on("error", function(e) {
            callback(e);
        })
    }).on('error', function(e) {
        callback(e)
    });
}

getGzipped(url, function(err, data) {
   console.log(data);
});
40
ответ дан WearyMonkey 19 August 2018 в 03:13
поделиться
  • 1
    Я закончил тем же ... спасибо! – izk 8 October 2012 в 22:38
  • 2
    в конце концов! Я собирал заголовки настроек, чтобы принять gzip и попробовать прокси-сервер и всевозможные вещи, но это помогло работать с API-интерфейсом stackoverflow! Одна незначительная вещь: var gunzip = gzip.createGunzip(); должна быть var gunzip = zlib.createGunzip(); – mlunoe 15 April 2013 в 00:23
  • 3
    Спасибо mlunoe, зафиксировал его. – WearyMonkey 9 May 2013 в 01:34
  • 4
    Я попытался использовать все методы для запроса, но не смог. Это работает! – paradite 15 July 2014 в 19:22
  • 5
    Это работает, но есть намного лучший и простой способ сделать это, установив несколько параметров в модуле запроса. Пожалуйста, прочтите мой ответ ниже. – Sai Teja 11 November 2017 в 07:44

Как и @Iftah, установите encoding: null.

Полный пример (меньше обработки ошибок):

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

request(url, {encoding: null}, function(err, response, body){
    if(response.headers['content-encoding'] == 'gzip'){
        zlib.gunzip(body, function(err, dezipped) {
            callback(dezipped.toString());
        });
    } else {
        callback(body);
    }
});
22
ответ дан Alexey B. 19 August 2018 в 03:13
поделиться

Как видно из https://gist.github.com/miguelmota/9946206 :

Оба запроса и запроса-обещания обрабатывают его из коробки по состоянию на декабрь 2017 года :

var request = require('request')
  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)
    }
  )
2
ответ дан Francisco Carriedo Scher 19 August 2018 в 03:13
поделиться

попробуйте добавить encoding: null к параметрам, которые вы передаете в request, это позволит избежать преобразования загруженного тела в строку и сохранить его в двоичном буфере.

34
ответ дан Iftah 19 August 2018 в 03:13
поделиться
  • 1
    У меня была та же проблема, этот вариант кодирования работал для меня. Спасибо !! – user209377 18 November 2012 в 12:35

Вот мои две центы. У меня была та же проблема, и я нашел классную библиотеку под названием concat-stream:

let request = require('request');
const zlib = require('zlib');
const concat = require('concat-stream');

request(url)
  .pipe(zlib.createGunzip())
  .pipe(concat(stringBuffer => {
    console.log(stringBuffer.toString());
  }));
2
ответ дан Mark Robson 19 August 2018 в 03:13
поделиться

На самом деле модуль запроса обрабатывает ответ gzip. Чтобы сообщить модулю запроса декодировать аргумент body в функции обратного вызова, мы должны установить значение «gzip» в опции. Позвольте мне объяснить вам пример.

Пример:

var opts = {
  uri: 'some uri which return gzip data',
  gzip: true
}

request(opts, function (err, res, body) {
 // now body and res.body both will contain decoded content.
})

Примечание. Данные, которые вы получаете в случае «ответа», не декодируются.

работает на меня. Надеюсь, что это сработает и для вас, ребята.

Аналогичная проблема, с которой мы столкнулись, работая с модулем запроса, связана с разбором JSON. Позвольте мне объяснить это. Если вы хотите, чтобы модуль запроса автоматически анализировал тело и предоставлял вам содержимое JSON в аргументе body. Затем вам нужно установить «json» в true.

var opts = {
  uri:'some uri that provides json data', 
  json: true
} 
request(opts, function (err, res, body) {
// body and res.body will contain json content
})

Ссылка: https://www.npmjs.com/package/request#requestoptions-callback

21
ответ дан Sai Teja 19 August 2018 в 03:13
поделиться
  • 1
    Спасибо тебе за это!! он работает, и я не знал, что запрос-обещание имеет флаг gzip. – Steven R 30 December 2016 в 22:08
  • 2
    Добро пожаловать!. Рад, что это тебе помогло. @StevenR – Sai Teja 1 March 2017 в 06:57
  • 3
    это должен быть принятый ответ. большое спасибо. – Dat30 21 February 2018 в 23:17

Я сформулировал более полный ответ , пытаясь разыгрывать разные способы уничтожения и решая ошибки, связанные с кодированием.

Надеюсь, это вам тоже поможет:

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

var options = {
  url: 'http://some.endpoint.com/api/',
  headers: {
    'X-some-headers'  : 'Some headers',
    'Accept-Encoding' : 'gzip, deflate',
  },
  encoding: null
};

request.get(options, function (error, response, body) {

  if (!error && response.statusCode == 200) {
    // If response is gzip, unzip first
    var encoding = response.headers['content-encoding']
    if (encoding && encoding.indexOf('gzip') >= 0) {
      zlib.gunzip(body, function(err, dezipped) {
        var json_string = dezipped.toString('utf-8');
        var json = JSON.parse(json_string);
        // Process the json..
      });
    } else {
      // Response is not gzipped
    }
  }

});
4
ответ дан samwize 19 August 2018 в 03:13
поделиться

С помощью got , альтернативы request, вы можете просто выполнить:

got(url).then(response => {
    console.log(response.body);
});

Декомпрессия обрабатывается автоматически, когда это необходимо.

1
ответ дан Sindre Sorhus 19 August 2018 в 03:13
поделиться

Вот рабочий пример (с использованием модуля запроса для узла), который запускает ответ

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
ответ дан user764155 19 August 2018 в 03:13
поделиться
  • 1
    Огромное спасибо. У меня были проблемы с этим, и я использовал ваше решение, прекрасно работает. – thtsigma 5 April 2013 в 13:43
  • 2
    очень красиво сделано. Thx для сущности. – rdodev 4 December 2013 в 00:31
Другие вопросы по тегам:

Похожие вопросы: