【问题标题】:"Body" of a post request always in unicode发布请求的“正文”始终为 unicode
【发布时间】:2018-12-07 03:11:06
【问题描述】:

如果我使用 Chrome 插件向特定服务器发出 POST 请求,我可以看到“响应正文”以 JSOn 格式正常返回。

但是,当我尝试使用“request”或“https.request”执行此操作时,“body”以我似乎无法破译的 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 请求的两个代码 sn-ps:

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

【问题讨论】:

  • 能贴出代码吗?
  • @JanithKasun 我编辑它以发布代码
  • 您是否有可能使用其他库,例如request
  • 我正在使用请求,如我正在使用的第一个代码 sn-p 中所见@JanithKasun
  • 什么是entriesPayload?如果它是一个文件 - 请发布读取它的代码。

标签: node.js post https


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,t.m.adam,希望你一切都好。如果您有机会试一试this post,我将非常高兴。提前致谢。
【解决方案2】:

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

您能否更改您的请求,使其包含

request({
   'url': externalUrl,
   'method': 'POST',
   'json': entriesPayload,
   'Content-Type': 'application/x-www-form-urlencoded'
});

【讨论】:

  • 似乎不起作用,我的原始问题已编辑为我现在拥有的内容。我的 chrome 插件默认有“application/json;charset=utf-8”,但是当我把它放进去时,unicode 中的所有东西都被窃听了。但是,当我输入“application/x-www-form-urlencoded”时,我没有收到错误的响应,但外部服务器会返回 404 响应。此外,当我根本没有“授权”时,外部服务器会返回正确的错误响应,我可以阅读它。只是不确定为什么某些错误会以我无法阅读的 unicode 格式返回。
  • 我还添加了我遇到的另一个奇怪的东西,我把它放在上面原始问题的末尾
猜你喜欢
  • 2021-02-01
  • 2017-07-10
  • 2015-09-08
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2020-03-21
  • 2018-04-26
  • 2020-12-13
相关资源
最近更新 更多