8

応答をテキストとして表示できるように、ノックレコーダーによって生成された出力をアドホックにデコード/解凍する方法は? 応答が gzip および/またはエンコードされているかどうかはわかりません。

オブジェクトを nock にロードすると、オブジェクトは find で動作し、テストは期待どおりに動作しています。API が生成したものを確認するには、ロギング ステートメントを実装ファイルに配置する必要があります。

応答の JSON を記録して保存しています。

nock.recorder.rec({output_objects: true, dont_print: true});
JSON.stringify(nock.recorder.play())

ファイルは次のようになります。

[ { "scope": "https://some.api.com:443", "method": "POST", "path": "/auth?key=some_key", "body": { "logonId": "user@api.com", "logonPassword": "secret" }, "status": 400, "response": [ "1f8b0800000000000000458cbd6ac34010067b3fc5c735691263bb741344ec42f827420a492916692d1d9cb461f71c218cdf3d97266e6786b92d00c7aaa205290d1c59cd6d71bb3fff8b376939a1cd6abd7ac003cf89b97a5f96757efecc8ef9aede9fb2fc586455f5f55eeedca33db119757f0f5704266334a2ca4d44ec19170941263f76f06657b62dd6cb2af919ec9357cc7255f0cb403e4014df643689b6687d3b3e450c149b1e534f1113a3a71f868cb8f8c04b7ca48b8fa08efcf8ea16f75fa1776d91ee000000" ], "headers": { "cache-control": "no-store, no-cache, must-revalidate", "content-encoding": "gzip", "content-type": "application/json", "transfer-encoding": "chunked", "connection": "Close" } } ]

4

4 に答える 4

4

http 要求からの応答は、gzip されたデータとして返され、content-encodingヘッダーで示されます。Nock は、このデータを 16 進数でエンコードされたバッファー文字列として保存しています。

次のユーティリティを使用して、これらのカセットを json に変換できます。

var zlib = require('zlib');
var fs = require('fs');
var argv = process.argv.slice(2);
var path = require('path');

var filename = path.resolve(argv[0]);
var file = fs.readFileSync(filename, { encoding: 'utf8' });
var cassettes = JSON.parse(file);

cassettes.forEach(function (cassette) {
  if (cassette.headers['content-encoding'] !== 'gzip') {
    return;
  }

  var response = new Buffer(cassette.response[0], 'hex');

  var contents = zlib.gunzipSync(response).toString('utf8');

  cassette.response = JSON.parse(contents);
  delete cassette.headers['content-encoding'];
});

fs.writeFileSync(filename, JSON.stringify(cassettes, null, 2), { encoding: 'utf8' });

これにより、すべての gzip リクエストを json に変換したカセットで元のカセットが上書きされることに注意してください。また、コンテンツ タイプをチェックしていないことにも注意してください。したがって、json ではない応答がある場合は、これを調整する必要があります。

于 2016-05-31T19:40:07.433 に答える
1

xxdjqを使用して、応答フィールドを抽出してデコードします。

jq -r .response file.json | xxd -r -p | gunzip
于 2020-09-15T23:26:11.497 に答える
0

パーティーに少し遅れましたが、Franco Rondini と ChiperSoft の回答を使用して、次のことを思いつきました。

const zlib = require('zlib');

// Goes from a hex representation of gzipped binary data to an object
module.exports.decode = input => {
  if (typeof input.join === 'function') {
    input = input.join('');
  }

  const tempBuffer = Buffer.from(input, 'hex');
  const unzippedBuffer = zlib.gunzipSync(tempBuffer);
  const contents = unzippedBuffer.toString('utf8');

  return JSON.parse(contents);
};

// Goes from an object to a zipped buffer encoded in hex
module.exports.encode = input => {
  const inputAsString = JSON.stringify(input);
  const tempBuffer = Buffer.from(inputAsString);
  const zippedBuffer = zlib.gzipSync(tempBuffer);

  return zippedBuffer.toString('hex');
};

これはおそらく完璧ではありませんが、その場で返信をオブジェクトに置き換えることができるのは役に立ちました。

于 2020-05-06T16:47:18.647 に答える