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

时间:2018-12-07 03:11:06

标签: node.js post https

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

但是,当我尝试使用“ request”或“ https.request”来执行此操作时,“ body”作为Unicode回来了,我似乎无法解读。任何人都知道我如何将正文作为常规JSON返回,或者如何解密此unicode?我尝试了一些stackoverflow解决方案来解密unicode,但是没有运气。

原始主体:

public static void main(String[] args) {
        GraphicsWindow Graphics = new GraphicsWindow();
        Graphics.setBackground(Color.green);
        Graphics.setSize(1000, 800);
        JFrame Window = new JFrame("Snake");
        Window.add(Graphics);
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setBounds(650, 200, 1200, 1000);
        Window.setVisible(true);
        Graphics.repaint();
    }

如果我这样做:JSON.stringify(body,null,4)

��RPP�M-.NLOUR�RP�I,�K�P�,V��/QHL.�,KU��J�O�*─
                                                                 �⎽�����wt�
                                                                           ⎽U��┬�>H ---

这是我用来尝试发出POST请求的两个代码段:

 "\┤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" 

和:

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"
      },
    },
...

在发出请求之后,我的IDE日志中也发生了一些真正的怪异事情。这就是显示的内容-就像将所有内容转换为一些不同的符号一样(最后三行是我重新启动Node.js服务器的方式)。

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

2 个答案:

答案 0 :(得分:3)

响应主体不是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();

答案 1 :(得分:0)

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

您可以更改您的请求,使其包含

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