如果我使用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();
答案 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'
});