HTTPClient MultipartEntity, кажется, добавляет мусорный текст в части StringBody - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь использовать HttpClient от Apache Commons для отправки многочастного POST-запроса с двоичным файлом и парой строковых параметров.

Однако, кажется, что где-то вдоль строки появляется какой-то мусорный текстпуть в мои строковые параметры.Например, как подтверждено отладчиком, переменная sizeBody здесь действительно содержит значение "100":

StringBody sizeBody = new StringBody("100", Charset.forName("UTF-8"));

Однако, если я слушаю запрос с Wireshark, я вижу это:

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa
Content-Disposition: form-data; name="x"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

100
a5

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa

Обратите внимание на a5 после 100.

Что может быть причиной этого?Куда мне смотреть?

Ответы [ 2 ]

1 голос
/ 12 мая 2011

То, что вы видите, может быть заголовками чанка, используемыми так называемой кодировкой передачи чанка [1]. Проверьте, имеет ли заголовок сообщения поле Transfer-Encoding: chunked.

[1] http://en.wikipedia.org/wiki/Chunked_transfer_encoding

0 голосов
/ 10 мая 2012

У меня была такая же проблема при тестировании моих POST с NanoHTTPD их получением.Действительно, HttpClient использует кодирование передачи по частям, которое NanoHTTPD не поддерживает.Это было сделано в моем случае, потому что двоичный файл был передан через InputStreamBody, и поскольку он не может определить собственную длину контента (он просто отправляет обратно -1), клиент использует чанкованное кодирование.

Я переключилсяк использованию ByteArrayBody для содержимого файла, и поскольку это и StringBody могут предоставлять длины содержимого, запросы теперь не используют фрагментированное кодирование.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy (fileInputStream, baos);  // from Apache Commons IO, or roll your own
ContentBody filePart = new ByteArrayBody (baos.toByteArray(), fileName);

Конечно, если ваш файл огромен,загрузка всего этого в байтовый массив, как указано выше, может вызвать проблемы с памятью.

...