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:)
Во всяком случае, по моему мнению, конструктор форм вводит в заблуждение.