2015-01-26 3 views
4

Как ad-hoc декодировать/распаковывать выходные данные, производимые носовым рекордером, чтобы мы могли видеть ответ в виде текста? Я думаю, мы не понимаем, является ли ответ gzipped и/или закодированКак декодировать записанный отклик

Объект работает, когда мы загружаем его в нок, и наши тесты ведут себя так, как мы ожидаем. Чтобы узнать, что созданный 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": "[email protected]", "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" } } ]

ответ

1

Отклик из запроса HTTP возвращается в виде с gzip'нутыми данных, обозначенное по заголовку content-encoding. Nock сохраняет эти данные в шестнадцатеричной кодированной строке буфера.

Вы можете преобразовать эти кассеты в 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.

Смежные вопросы