邮件请求的“正文”始终为unicode

问题描述 投票:2回答:2

如果我使用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 ---

如果我这样做: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" 

这是我用来尝试发出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"
      },
    },
...

和:

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();

在我的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
node.js post https
2个回答
3
投票

响应主体不是unicode编码的,而是GZIP编码的(压缩数据)。我们可以使用Content-Encoding标头检查响应是否已压缩:

var encoding = res.headers['content-encoding'];

https不会像浏览器那样自动解压缩响应体,因此您可以获得所有这些奇怪的字符而不是JSON字符串。但是,我们可以使用内置的zlib库并对字符串的响应进行decdode。

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();

0
投票

您用于POST的chrome插件可能正确设置了内容类型,而您的服务器的常规请求则没有。

你可以改变你的要求吗?

request({
   'url': externalUrl,
   'method': 'POST',
   'json': entriesPayload,
   'Content-Type': 'application/x-www-form-urlencoded'
});
© www.soinside.com 2019 - 2024. All rights reserved.