request模块发POST请求的中文参数问题
发布于 8 年前 作者 sunshineclt 12996 次浏览 来自 问答

我想用Node.js做一个爬虫,目标网页是gb2312编码的,我已经根据网上的方法处理好了返回的gb2312的编码(用iconv) 但是现在还有一个问题:有一个网页需要发送POST的搜索请求,其中发送的请求参数中有中文,并且网站也要接受gb2312编码的参数,否则就会返回不正常的东西。 但是我试了很多种方法都没有办法在request请求参数中正确加上gb2312编码的参数,特来求各位大大解答。 使用的模块:request 2.67.0, iconv-lite: 0.4.13 已尝试的方法: 1、直接使用request库发送POST请求,中文会使用utf-8编码,不行 2、用一段代码手工把中文转换成gb2312编码的字符串,但把转换过的字符串传到request的form中去后,request又会对其中的%编码为%25,所以也不行 3、使用node自带的http模块,同1 4、使用fetch模块,同1

10 回复

这样, 用iconv-lite先将字符串encode成buffer, 然后在 ClientRequest#write(buffer)

var buf = iconv.encode('para=中文', 'gb2312');
var req = http.request({
  method: 'POST',
  host: 'www.awesome_site.com',
  path: '/awesome_path'
}, res => {
  // blabla
});

req.write(buf);
req.end();

superagent 的 write 也是调用内部 ClientRequest#write https://github.com/visionmedia/superagent/blob/v1.7.2/lib/node/index.js#L483 对于返回值是 gbk / gb2312, 可以使用这个 https://github.com/magicdawn/superagent-charset

sorry, 上述代码没有进行 urlencode 操作, 你真正需要的是 fengmk2 的这个包 https://www.npmjs.com/package/urlencode

@magicdawn 这个库确实可以进行gbk编码,但是把编码后的字符串传到request的form里面去的时候转码后的%又会被request转码一次成%25,然后发出去的请求就是错误的,怎么办呢

@sunshineclt

你可以使用 req = request.post(xxxx); req.write(urlencode(‘para=中文’, ‘gb2312’)) 这种~

@magicdawn 终于成功了,谢谢你!

贴上代码供后人参阅 var post_request = request.post({encoding: null, url: url}, function(error, response, body) { }); post_request.write(“param=” + urlencode(“中文参数”, ‘gb2312’));

@magicdawn 你好,请教下,前提相同,如果是用 superagent-charset 这个模块,代码要如何写?跪谢

@hanzichi superagent-charset 是用于返回是 gbk / gb2312 / other charset 的, 请求就自己写就行了

@magicdawn 请求写在 send 里,不行,是不是也是又被编码了一次的原因?

回到顶部