如何在node.js上使用请求模块设置POST编码?

时间:2015-12-11 20:26:54

标签: node.js request

我在node.js上使用请求模块,但编码选项存在问题。代码下面是简单的帖子请求,但我不知道如何设置表单字段数据的编码。我已经将标题设置为'Content-Type': 'application/x-www-form-urlencoded; charset=euc-kr'但它不起作用。现场数据是韩国的,比如“안녕하세요”,我应该用 euc-kr 编码发布。 (该网站采用euc-kr,而不是utf8)

Java应用程序上的相同程序,我编码如下:

PrintWriter wr = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "euc-kr"));

但我不知道如何在nodejs中。谁能给出一些解决方案......?

代码示例

//Load the request module
var request = require('request');

//Lets configure and request
request({
    url: 'http://google.com', //URL to hit
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=euc-kr' },
    method: 'POST',
    form: {
        field1: 'data',
        field2: 'data'
    }
}, function(error, response, body){
    if(error) {
        console.log(error);
    } else {
        console.log(response.statusCode, body);
    }
});

2 个答案:

答案 0 :(得分:2)

最后我得到了灵魂,我解决了这个问题。

如果使用请求模块将数据作为表单发送,则模块会强制将表单编码更改为utf-8。因此,即使您将表单编码设置为另一个字符集,模块也会再次将您的字符集更改为utf8。您可以在1120-1130行的request.js上看到。

所以,您最好通过' body'发送数据。选项,而不是'形式'选项。

答案 1 :(得分:1)

节点不支持EUC-KR,因此您可以使用iconv-lite扩展可用的原始编码,并在encoding中设置request选项。

List of Natively Supported Encodings

iconv.extendNodeEncodings();仅适用于节点pre v4 +。请参阅here以使其适用于较新版本的节点。

var iconv = require('iconv-lite');
var request = require('request');

// This will add to the native encodings available.
iconv.extendNodeEncodings();

request({
  url: 'http://google.com', //URL to hit
  method: 'POST',
  form: {
    field1: 'data',
    field2: 'data'
  },
  encoding: 'EUC-KR'
}, function(error, response, body){
  if(error) {
    console.log(error);
  } else {
    console.log(response.statusCode, body);
  }
});

iconv.undoExtendNodeEncodings();