0

我正在尝试将表单数据从 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);
    ...

当我的输入 javaparams有一个包含 UTF-8 字符的值时,我得到的服务器端的日志会打印没有这个字符的相应值,所以它在某些时候有点被吞没。例如,如果我的输入字符串是"ê",那么我的服务器日志将打印一个""值。

当我读到它是发送可以包含非 ASCII 字符的数据的最佳方式时,我使用了多部分表单。Formidable 显然也是处理包含 UTF-8 字符的表单的最佳节点包。

我的客户端使用 Apache HttpClient 4.3.3。

我究竟做错了什么?

4

1 回答 1

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 字符 :)

无论如何,在我看来,表单构建器非常具有误导性。

于 2014-08-31T17:06:52.403 回答