Mik*_* K. 3 https post node.js
如果我使用 Chrome 插件向特定服务器发出 POST 请求,我可以看到“响应正文”以 JSOn 格式返回就好了。
但是,当我尝试使用“请求”或“https.request”执行此操作时,“正文”作为 unicode 返回,我似乎无法破译。任何人都知道我如何让身体恢复为常规的 JSON,或者我如何破译这个 unicode?我尝试了一些 stackoverflow 解决方案来破译 unicode,但没有运气。
原始身体:
??RPP?M-.NLOUR?RP?I,?K?P?,V??/QHL.?,KU??J?O?*?
???????wt?
?U????>H ---
Run Code Online (Sandbox Code Playgroud)
如果我这样做: JSON.stringify(body, null, 4)
"\?001°?\?\?0000\?0000\?0000\?0000\?0000\?0000\?0000??RPP?M-.NLOUR?RP?I,?K?P?,V??/QHL.?,KU?\?0001?J?O?*?\°??????\?000°???\?000??\°?U?\?0005\?0000???>H\?0000\?0000\?0000"
Run Code Online (Sandbox Code Playgroud)
这是我用来尝试发出 POST 请求的两个代码片段:
request({
'url': 'https://api.nike.com/launch/entries/v2',
'method': 'POST',
'json': entriesPayload,
'headers': {
'authorization': authId,
"Accept": "application/json, text/plain, */*",
'Content-Type': "application/json;charset=utf-8"
},
},
...
Run Code Online (Sandbox Code Playgroud)
和:
var options = {
hostname: 'api.nike.com',
port: 443,
path: '/launch/entries/v2',
method: 'POST',
json: entriesPayload,
headers: {
'authorization': authId,
"Accept": "application/json, text/plain, */*",
'Content-Type': 'application/json;charset=utf-8'
}
};
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (e) => {
console.error(e);
});
req.write(postData);
req.end();
Run Code Online (Sandbox Code Playgroud)
此外,在我提出请求后,在我的 IDE 日志中,我得到了一些真正奇怪的事情。这就是显示的内容 - 它就像将所有内容转换为一些不同的符号(最后 3 行是我重新启动 nodejs 服务器的方式)。
"????": 443,
"????????": "???.????.???",
"????": ????,
"??????": ????,
"?????": ????,
"????????": "/??????/???????/?2",
"????": "/??????/???????/?2",
"???°": "?????://???.????.???/??????/???????/?2"
£,
"??????": "POST",
"???????": ?
"?????????????": "B????? ??J??G??O?JSU?I1N?I?I???ZCI6I??2YWI1NT??LWM?ZTM?NGV?Y?05MT??LTJ?Y?A3Y?F?N2N?MHN?Z?J9.??J0??V??CI6MTA?LCJ?YXQ?O?E1NDM2N???ODA?I?V4?CI6MTU0M?Y4MDY4MC???XN?I????2F1?G±?YWN?I?????R?I???ZGV?MTZ?M2Q?YT±?OS00OTE3LWF?MD??NWV?N?R?M?U?MWM4I????GF0I???NTQ?N??3MD±?LCJ??WQ?O?J??20?????ZS5??W???GF?I????3V?I???Y29?L?5??2U?Y29??WV?Y2U??25???M??2V?I????2J0I???????ZT???HA?LCJ?Y3A?O???Y29??WV?Y2U?XS???HJ?I???M?I?M?J?Y?U?MWE1Y?00ZWJ?LT?0Z?Y?MGU?N?V?OGV?NGQ?I????HJ0I???????ZT???HV?I?0.I????U2W??__?AD?J±?Z???-VVUV?H??EI??T??1I9°?OSL???8?0Z3?C??G??O?????3RB?GKXV?SDRDH±IYZ?H1X?5?Q-?R???I???M0?I?R?????I??NC??G±6?XQ?°R?W5??SZ??4YR2TN6U?9Q??61NS??F?2V13NJ?0P7?K5-09??1?6P?M???IWF??II?G?K?HO?BV????A?°?AF?K1GC?ZGD?TC?8?JY_?HI-E8D±M?O4KSN?H97KLHO-?Z?2?YLJ2°?0?F?D???A?K?9???9??XF?????22?39KD?-??R?I?MD2????L1CA?8?-?L?DY??GQ02C?I0??±",
"A?????": "???????????/????, ????/?????, */*",
"C??????-T???": "???????????/????;???????=??°-8",
"???????-???±??": 575
£
£
£
[???????] ?????????± ??? ?? ????±??...
[???????] ???????± ????? ???.???
E?????? ??????? ?? ???? 3000
Run Code Online (Sandbox Code Playgroud)
响应正文不是 unicode 编码的,而是 GZIP 编码的(压缩数据)。我们可以检查响应是否使用 Content-Encoding 标头压缩:
var encoding = res.headers['content-encoding'];
Run Code Online (Sandbox Code Playgroud)
https不会像浏览器那样自动解压缩响应正文,因此您会得到所有这些奇怪的字符而不是 JSON 字符串。但是,我们可以使用内置zlib库并将响应解码为字符串。
const https = require('https');
const zlib = require('zlib');
var options = {
hostname: 'api.nike.com',
port: 443,
path: '/launch/entries/v2',
method: 'POST',
headers: {
'Authorization': 'my-token',
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json;charset=utf-8'
}
};
var data = JSON.stringify({});
var req = https.request(options, (res) => {
var encoding = res.headers['content-encoding'];
console.log('code:', res.statusCode);
console.log('encoding:', encoding);
deflate = zlib.createGunzip();
res.pipe(deflate);
deflate.on('data', (chunk) => {
console.log('data: ' + chunk.toString());
});
});
req.on('error', (e) => {
console.error(e);
});
req.write(data);
req.end();
Run Code Online (Sandbox Code Playgroud)