帖子请求的“正文”始终采用 unicode

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)

t.m*_*dam 7

响应正文不是 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)