UTF-8 символов в параметрах формы запроса HTTP POST

Я пытаюсь перенести данные формы из приложения 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 ответ

Решение

Итак, я проверил с помощью простого запроса и значения ключа ("foo","[ê]") посмотрел на заголовки, и я увидел, что мой запрос все еще использует ISO-8859-1

Content-Disposition: form-data; name="foo"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
[]

в противоречие с моим параметром строителя. Я нашел решение через /questions/38795806/multipartentitybuilder-i-charset/38795828#38795828 и изменил свой код на:

for (final Entry<String, String> e : params.entrySet()) {
      mpb.addTextBody(e.getKey(), e.getValue(), ContentType.create("text/plain", Charset.forName("UTF-8")));
    }

И теперь сервер получает символы UTF8:)

Во всяком случае, по моему мнению, конструктор форм вводит в заблуждение.

Другие вопросы по тегам