Node.js http.request()返回响应出现乱码

发布时间:2020-07-11编辑:佚名阅读(1406)

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


  关键字:Node.jshttp.request()返回响应乱码


鼓掌

0

正能量

0

2

呵呵

0


评论区