40

簡単な HTTP POST リクエストを送信して、レスポンスの本文を取得しようとしています。以下は私のコードです。私は得ています

エラー: ヘッダー チェックが正しくありません

「zlib.gunzip」メソッド内。私はnode.jsが初めてで、助けていただければ幸いです。

;

    fireRequest: function() {

    var rBody = '';
    var resBody = '';
    var contentLength;

    var options = {
        'encoding' : 'utf-8'
    };

    rBody = fSystem.readFileSync('resources/im.json', options);

    console.log('Loaded data from im.json ' + rBody);

    contentLength = Buffer.byteLength(rBody, 'utf-8');

    console.log('Byte length of the request body ' + contentLength);

    var httpOptions = {
        hostname : 'abc.com',
        path : '/path',
        method : 'POST',
        headers : {
            'Authorization' : 'Basic VHJhZasfasNWEWFScsdfsNCdXllcjE6dHJhZGVjYXJk',
            'Content-Type' : 'application/json; charset=UTF=8',
            // 'Accept' : '*/*',
            'Accept-Encoding' : 'gzip,deflate,sdch',
            'Content-Length' : contentLength
        }
    };

    var postRequest = http.request(httpOptions, function(response) {

        var chunks = '';
        console.log('Response received');
        console.log('STATUS: ' + response.statusCode);
        console.log('HEADERS: ' + JSON.stringify(response.headers));
        // response.setEncoding('utf8');
        response.setEncoding(null);
        response.on('data', function(res) {
            chunks += res;
        });

        response.on('end', function() {
            var encoding = response.headers['content-encoding'];
            if (encoding == 'gzip') {

                zlib.gunzip(chunks, function(err, decoded) {

                    if (err)
                        throw err;

                    console.log('Decoded data: ' + decoded);
                });
            }
        });

    });

    postRequest.on('error', function(e) {
        console.log('Error occured' + e);
    });

    postRequest.write(rBody);
    postRequest.end();

}
4

4 に答える 4

24

response.on('data', ...)Bufferプレーンな文字列だけでなく、を受け入れることができます。連結すると、文字列に正しく変換されず、後で gunzip できません。次の 2 つのオプションがあります。

1) 配列内のすべてのバッファーを収集し、endイベントで を使用してそれらを連結しますBuffer.concat()。次に、結果に対して gunzip を呼び出します。

2).pipe()応答を使用して gunzip オブジェクトにパイプし、結果をメモリに格納する場合は、その出力をファイル ストリームまたは文字列/バッファー文字列にパイプします。

オプション (1) と (2) の両方がここで説明されています: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression

于 2013-10-18T06:37:56.087 に答える
0

@Nitzan Shaked の回答に加えて、これはNode.js バージョンに関連している可能性があります。

私が経験したことは、https.request(OP は を使用しhttp.requestますが、同じように動作する可能性があります) は既にフードの下でデータを解凍しているため、チャンクをバッファーに蓄積したら、あとは呼び出すだけですbuffer.toString()(例として utf8 を想定) )。私自身がこの他の回答でそれを経験しましたが、Node.jsのバージョンに関連しているようです。

この回答を、将来の読者にとって便利な同様の作業コードのライブデモで締めくくります(StackExchange APIをクエリし、gzip圧縮チャンクを取得してから解凍します):

  • これには、14.16.0 (現在の StackBlitz バージョン) で動作するコードが含まれています。前述のように、内部でデータを解凍していますが、Node.js 15.13.0 では動作しません。
  • Node.js 15.13.0 以降では機能するが、14.16.0 では機能しないコメントアウトされたコードが含まれています。
于 2021-09-20T14:03:23.810 に答える