0

Nodeのrequestモジュールを使用しています。
私が受け取る応答は「gzip」またはエンコードされています。

どうすればよいですか
1.応答をエンコードしないように要求を作成しますか?
2.応答をデコードしますか?データはhttp://api.stackexchange.com
から取得されます。

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

var stackRequest = require('request'); 
var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
stackRequest(
    { method: 'GET'
        , uri: 'http://api.stackexchange.com/2.1/questions?key=' + apikey + 
          '&site=stackoverflow&fromdate=' + fromdate + '&order=desc&' + 
          'sort=activity&tagged=' + tagged + '&filter=default'
}, function(err, response, body) { 
    console.log(response.body); // How can I decode this?
}); 
4

2 に答える 2

2

エンコーディングは関係ありませんrequestStackOverflow の API は、API ドキュメントで説明されているように、常に GZip でエンコードされたデータを返します。zlibコンテンツを解凍するには、 Node のモジュールを使用する必要があります。これは簡単な例です:

var zlib = require('zlib');

// Other code

, function(err, response, body) {
   zlip.gunzip(body, function(err, data){
     console.log(data);
  });
});

これの主な欠点は、requestモジュールが応答コンテンツ全体をBufferとして1 つに処理することを強制することですbody。代わりに、通常はノードのStreamシステムを使用して、要求からのデータを解凍ライブラリを介して直接送信する必要があります。これにより、使用するメモリが少なくなります。JSON を解析するには、パーツを結合する必要がありますが、それでもなお優れています。

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

var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
var compressedStream = request('http://api.stackexchange.com/2.1/questions?' +
    'key=' + apikey + '&site=stackoverflow&fromdate=' + fromdate +
    '&order=desc&sort=activity&tagged=' + tagged + '&filter=default');

var decompressedStream = compressedStream.pipe(zlib.createGunzip());

var chunks = [];
decompressedStream.on('data', function(chunk){
  chunks.push(chunk);
});
decompressedStream.on('end', function(){
    var body = Buffer.concat(chunks);

    var data = JSON.parse(body);

    // Do your thing
});
于 2013-01-30T06:04:58.173 に答える
0

最初のセットは受け入れます: ヘッダーとしてのアイデンティティ。積み重ねられた変更が通常の UTF8 としてデータを送信しない場合、それは彼らの側のバグです。

次に、エンコードを UTF8 に設定して、応答がバッファーにならないようにします。

于 2013-01-30T08:15:11.627 に答える