HTTP POST查询表单参数中的UTF-8字符

时间:2014-08-19 18:11:34

标签: java http utf-8 apache-httpclient-4.x formidable

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

我做错了什么?

1 个答案:

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

无论如何,表单构建器在我看来是相当误导的。