urlencoding表单数据与node.js

时间:2016-08-11 12:40:16

标签: node.js forms url-encoding

我需要发布一个表单,该表单已设置为使用windows-1252 charset对其数据进行urlencoding。对于简单字符,默认编码(utf8)有效,但它是必须使用所需字符集编码的特殊字符。

我使用的npm“request”包不允许设置任何特定的字符集,默认情况下使用utf8。我尝试了另一个包“Restler”,它允许设置编码,但是当我指定windows-1252时,它会抛出异常说无效字符集(Node只提供少量编码字符集(Buffer类),而windows-1252不是其中之一)

请让我知道我想要达到的目标是否甚至可以在节点中实现?出于验证目的,我在java中创建了一个小客户端,并使用apache的http客户端库和windows-1252编码,我的请求被服务器成功接受。到目前为止,我还没能在节点中解决这个问题。

1 个答案:

答案 0 :(得分:3)

在Windows-1252等传统编码中发送HTTP请求数据在节点中并不简单,因为这些编码没有本机支持。

支持可以以iconv库的形式添加,因此它绝对可行,即使它没有开箱即用。

以下目标restler,因为您正在使用它,但原则上这适用于任何客户端HTTP库。

注意:

  • 传统的HTTP POST是网址编码的,我们将使用qs进行此操作。
  • qs-iconv中提供的qs - Dealing with special character sets将提供对UTF-8以外编码的支持。
  • 如果您将数据作为字符串或普通对象传递,则Restler通常会将数据编码为UTF-8,但如果您传递Buffer,则Restler将按原样发送数据。
  • 设置正确的Content-TypeContent-Length可确保在接收端正确解释数据。由于我们在此处提供自己的数据,因此我们需要手动设置这些标头。
  • 请注意,目标字符集中未包含的任何字符(在本例中为Windows-1252) 将被iconv(?编码为%3F形式),因此将会丢失。

代码:

var rest = require('restler');
var qs = require('qs');
var win1252 = require('qs-iconv/encoder')('win1252');

var requestData = {
  key1: "‘value1‘",
  key2: "‘value2‘"
};

var requestBody = qs.stringify(requestData, { encoder: win1252 });
// => "key1=%91value1%91&key2=%91value2%91"

var requestBuf = new Buffer(requestBody);

rest.post('your/url', {
  data: requestBuf,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=windows-1252',
    'Content-Length': requestBuf.length
  }
}).on('complete', function(data) {
  console.log(data);
});