我需要发布一个表单,该表单已设置为使用windows-1252 charset对其数据进行urlencoding。对于简单字符,默认编码(utf8)有效,但它是必须使用所需字符集编码的特殊字符。
我使用的npm“request”包不允许设置任何特定的字符集,默认情况下使用utf8。我尝试了另一个包“Restler”,它允许设置编码,但是当我指定windows-1252时,它会抛出异常说无效字符集(Node只提供少量编码字符集(Buffer类),而windows-1252不是其中之一)
请让我知道我想要达到的目标是否甚至可以在节点中实现?出于验证目的,我在java中创建了一个小客户端,并使用apache的http客户端库和windows-1252编码,我的请求被服务器成功接受。到目前为止,我还没能在节点中解决这个问题。
答案 0 :(得分:3)
在Windows-1252等传统编码中发送HTTP请求数据在节点中并不简单,因为这些编码没有本机支持。
支持可以以iconv
库的形式添加,因此它绝对可行,即使它没有开箱即用。
以下目标restler,因为您正在使用它,但原则上这适用于任何客户端HTTP库。
注意:
Buffer
,则Restler将按原样发送数据。Content-Type
和Content-Length
可确保在接收端正确解释数据。由于我们在此处提供自己的数据,因此我们需要手动设置这些标头。?
编码为%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);
});