«Тело» почтового запроса всегда в юникоде - PullRequest
0 голосов
/ 07 декабря 2018

Если я сделаю POST-запрос к определенному серверу, используя плагин Chrome, я вижу, что «тело ответа» прекрасно возвращается в формате JSOn.

Однако, когда я пытаюсь сделать это либо с«request» или «https.request», «body» возвращается как юникод, который я не могу расшифровать.Кто-нибудь знает, как я могу вернуть тело как обычный JSON, или как я могу расшифровать этот юникод?Я попробовал несколько решений для работы со стеком, чтобы расшифровать юникод, но безуспешно.

raw body:

��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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Тело ответа не в кодировке 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();
0 голосов
/ 12 декабря 2018

Плагин chrome, который вы используете для POST, вероятно, правильно устанавливает тип контента, в то время как ваш обычный запрос от вашего сервера - нет.

Можете ли вы изменить свой запрос, чтобы он включал

request({
   'url': externalUrl,
   'method': 'POST',
   'json': entriesPayload,
   'Content-Type': 'application/x-www-form-urlencoded'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...