如果我使用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├NGVY␋05MT┌┘LTJ┐Y┘A3Y┘F┘N2NMHN⎻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±│OS00OTE3LWFMD┐├NWVN≥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
响应主体不是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();
您用于POST的chrome插件可能正确设置了内容类型,而您的服务器的常规请求则没有。
你可以改变你的要求吗?
request({
'url': externalUrl,
'method': 'POST',
'json': entriesPayload,
'Content-Type': 'application/x-www-form-urlencoded'
});