API数据在控制台中返回Unicode字符

dem*_*123 7 javascript api encoding web-api-testing

自从过去两天以来,我面临一个相当混乱的问题.我正在开发一个文档管理系统,它使用从SOLR中提取数据的API.数据约为15Mbs,并提取超过4000个文档的记录.API有这种格式的响应 -

{
    "documents": [
        {
            id: 123,
            some_field: "abcd",
            some_other_field: "abcdef"
        },
        {
            id: 124,
            some_field: "abcd1",
            some_other_field: "abcdef1"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在浏览器中一切正常.如果我在Chrome或Firefox浏览器中点击端点,它会给我正确的输出,我能够看到JSON输出.

但是,如果我尝试使用Java或JS代码访问相同的API端点 - 响应代码为200,但控制台(终端或Eclipse)中\u0089 \u0078 U+0080的输出显示类似的unicode字符- 所有输出都以这种方式出现,并且因为有API提取了大约4000多条记录,控制台有点填充所有这些unicode字符.

我在浏览器和代码之间看到的唯一区别是,在浏览器中我可以看到Content-Encoding : gzip,而我无法从我编写的代码中找到此标头.例如 - 在JS代码中,通过Chakram框架,我可以检查

expect(response).to.be.encoded.with.gzip

这里提到的.但是,这会返回失败说明expected undefined to match gzip

我在这里错过了什么?这是与编码/解码有关的东西还是完全不同的东西?

编辑1:NetworkChrome标签中显示的响应标题:

cache-control: max-age=0, private, must-revalidate, max-age=315360000
content-encoding: gzip
content-type: application/json; charset=utf-8
date: Tue, 22 May 2018 06:07:26 GMT
etag: "a07eb7c1eef4ab97699afc8d61fb9c5d"
expires: Fri, 19 May 2028 06:07:26 GMT
p3p: CP="NON CUR OTPi OUR NOR UNI"
server: Apache
Set-Cookie : some_cookie
status: 200 OK
strict-transport-security: 
transfer-encoding: chunked
vary: Accept-Encoding
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-request-id: abceefr4-1234-acds-100b-d2bef2413r47
x-runtime: 3.213943
x-ua-compatible: chrome=1
x-xss-protection: 1; mode=block
Run Code Online (Sandbox Code Playgroud)

NetworkChrome标签中显示的请求标头

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Cookie: some_cookie
Host: abcd.bcd.com
IV_USER: demouser123
IV_USER_L: demouser123
MAIL: demouser@f.com
PERSON_ID: 123
Referer: http://abcd.bcd.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
X-CSRF-TOKEN: some_csrf_token
Run Code Online (Sandbox Code Playgroud)

编辑2:我正在使用的测试

describe('Hits required API',()=>{

    before(()=>{
        return chakram.wait(api_response = chakram.get(url,options));
    });

    it('displayes response',()=>{
        return api_response.then((t_resp)=>{
            console.log(JSON.stringify(t_resp));
            expect(t_resp).to.have.header('Content-Encoding','gzip');
        });
    });
Run Code Online (Sandbox Code Playgroud)

kar*_*hik 0

这与编码无关。Web 服务器通常会压缩为 gzip 以节省带宽,因为传输整个 15MB 文件是多余的,请参阅本文以了解有关 gZip 及其工作的更多信息 ( https://betterexplained.com/articles/how-to-optimize -your-site-with-gzip-compression/)。那么哪里出了问题,它在 chrome 中的工作原理非常简单 chrome 在其 devTools 中有一个内置的 unicode 解析器(甚至是 HTML 解析器),它可以向您显示解析的内容,而不是向您显示 Wiered 文本(在响应中可以看到相同的内容)预览选项卡旁边的选项卡)。为什么你看到奇怪的文本是因为你正在刺激响应,它将转义特殊字符(如果有)console.log(JSON.stringify(t_resp));。您不能在终端中使用不进行字符串化的东西console.log("response", t_resp);,因为终端没有 JSON 或 unicode 解析器,它只是以文本形式打印。尝试删除该控制台,因为对 15mb 文件进行字符串化是一个成本高昂的过程。

编辑1:- 如果您仍然想在控制台中输出,该怎么办。由于 NODE 默认情况下无法直接解码 gzip(不能使用 chakram,它只是一个 API 测试平台),因此您可以使用 zlib 来执行此操作。请找到示例片段

    const zlib = require('zlib');

describe('Hits required API',()=>{

    before(()=>{
        return chakram.wait(api_response = chakram.get(url,options));
    });

    it('displayes response',()=>{
        return api_response.then((t_resp)=>{
            zlib.gunzip(t_resp, function(err, dezipped) {
                console.log(dezipped);
            });
        });
    });
Run Code Online (Sandbox Code Playgroud)