gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:53:01 26 4
gpt4 key购买 nike

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

{
"documents": [
{
id: 123,
some_field: "abcd",
some_other_field: "abcdef"
},
{
id: 124,
some_field: "abcd1",
some_other_field: "abcdef1"
}
]
}

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

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

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

期望(响应).to.be.encoded.with.gzip

提到here .但是,这会返回一个失败信息,说明 expected undefined to match gzip

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

编辑 1:在 Chrome 的 Network 选项卡中看到的响应 header :

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

在 Chrome 的 Network 选项卡中看到的请求 header

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

编辑 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');
});
});

最佳答案

这与编码无关。 Web 服务器通常压缩为 gzip 以节省带宽,因为传输整个 15MB 文件是多余的,请参阅本文以了解有关 gZip 及其工作的更多信息 (https://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/)。那么它在哪里出错以及它在 chrome 中的工作方式非常简单 chrome 在其 devTools 中有一个内置的 unicode 解析器(甚至是 HTML 解析器),它可以向您显示已解析的内容而不是向您显示有线文本(在响应中可以看到相同的内容)预览选项卡旁边的选项卡)。为什么您看到奇怪的文本是因为您正在阻止将转义特殊字符(如果有)的响应 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);
});
});
});

关于javascript - API 数据在控制台中返回 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com