我正在尝试将表单数据从Android应用程序传输到NodeJs服务器。
我的客户端代码如下(可包含UTF-8字符的字符串是params
的值):
final HttpPost post = new HttpPost(url);
final MultipartEntityBuilder mpb = MultipartEntityBuilder.create()
.setCharset(Charset.forName("UTF-8")) // tried with or without this line
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // tried with or without this line
for (final Entry<String, String> e : params.entrySet()) {
mpb.addTextBody(e.getKey(), e.getValue());
}
post.setEntity(mpb.build());
final HttpClient httpClient = new DefaultHttpClient();
final HttpResponse response = httpClient.execute(request);
我的服务器代码如下:
app.post('/accesspoint', function(req, res) {
var body = req.body;
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.parse(req, function(err, fields, files) {
console.log(fields);
...
当我的输入java params
具有包含UTF-8字符的值时,我获取服务器端的日志会打印没有此字符的相应值,因此在某些时候它会被吞噬。例如,如果我的输入字符串是"ê"
,那么我的服务器日志将打印""
值。
我使用多部分表单,因为我读到这是发送可包含非ASCII字符的数据的最佳方式。 Formidable显然也是处理可包含UTF-8字符的表单的最佳节点包。
我的客户端使用Apache HttpClient 4.3.3。
我做错了什么?
答案 0 :(得分:0)
好的,所以我测试了一个简单的查询,键值("foo","[ê]")
查看了标题,我看到我的查询仍在使用ISO-8859-1
Content-Disposition: form-data; name="foo"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
[]
与我的builder参数相矛盾。 我通过https://stackoverflow.com/a/21020435/592392找到了解决方案,并将我的代码更改为:
for (final Entry<String, String> e : params.entrySet()) {
mpb.addTextBody(e.getKey(), e.getValue(), ContentType.create("text/plain", Charset.forName("UTF-8")));
}
现在服务器获取UTF8字符:)
无论如何,表单构建器在我看来是相当误导的。