响应体html是乱码,Node.js http.request()返回响应出现乱码

本文介绍了在使用Node.js的http模块进行HTTP GET请求时遇到的乱码问题,问题根源在于服务器返回的数据经过了gzip压缩。通过在响应流中加入gzip解压过程,成功解决了乱码问题。代码示例展示了如何在接收到gzip压缩内容时正确解码为UTF-8字符串。
摘要由CSDN通过智能技术生成

用Node.js做个小程序,用的是http.request(option,callback)方法,但返回的请求出现了乱码的问题。

代码如下:var http=require('http');

var options={

hostname:'...',

port:80,

path:'/bt.php?'+searchstring,

method:'GET'

};

var req=http.request(options,(res)=>{

var header=res.headers;

console.log(`STATUS: ${res.statusCode}`);

console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

res.setEncoding('utf8');

var html='';

res.on('data',(data)=>{

html+=data;

})

res.on('end',()=>{

console.log(html);

})

});

req.on('error',error=>{console.log("error:"+error.message)});

//req.write(searchstring);//因为我用的是get方法,所以并不用写数据到请求头

req.end();

实际运行的时候却发现返回的响应数据是乱码,一般是编码的问题,但代码中我明确指定了所用编码方式为“utf8”而且响应头中字符编码方式确实是“utf8”,返回的响应头:HEADERS: {"server":"Tengine","date":"Fri, 17 Feb 2017 14:03:58 GMT","content-type":"text/html; charset=utf-8","transferencoding":"chunked","connection":"keep-alive","set-cookie":[/*略去*/],"content-encoding":"gzip","vary":"Accept-Encoding"}

注意到内容编码方式为“gzip”,gzip压缩方式不就是压缩html、css、js文件什么的,减少体积以加快响应嘛。难道是它的问题?是因为gzip压缩使得返回的内容无法用utf8全部解出来导致出现乱码吗?先抱着试试的态度找下解决方案,在stackoverflow中找到了解决方案(How to use request or http module to read gzip page into a string),最终解决方案如下:var req=http.request(options,(res)=>{

var header=res.headers;

console.log(`STATUS: ${res.statusCode}`);

console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

var html='',output;

if(res.headers['content-encoding']=='gzip'){

var gzip=zlib.createGunzip();

res.pipe(gzip);

output=gzip;

}else{

output=res;

}

output.on('data',(data)=>{

data=data.toString('utf-8');

html+=data;

});

output.on('end',()=>{

console.log(html);

})

});

req.on('error',error=>{console.log("error:"+error.message)});

req.end();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值