Запрос apache cxf MultiPart не имеет заголовка Content-Length

У меня есть код ниже для отправки запроса multipart/form-data.

List<Attachment> multipartData = new ArrayList<>();
ContentDisposition cd1 = new ContentDisposition("form-data; name=\"file\"; 
filename="+fileObj.getName());

FileInputStream inputStream = new FileInputStream(fileObj);
multipartData.add(new Attachment("file",inputStream, cd1));

MultipartBody multipart = new MultipartBody(multipartData);

В моем классе RestClient я использую приведенные ниже строки кода для отправки запроса POST с использованием объекта JAX-RS Client.

if ("POST".equals(method)) {
            response = this.client.getBuilder().post(Entity.entity(entity,MediaType.MULTIPART_FORM_DATA));

Я проверил тело HTTP-запроса с помощью Wiremock и выглядит следующим образом:

Transfer-Encoding: [chunked]
Accept: [*/*]
Cache-Control: [no-cache]
User-Agent: [Apache-CXF/3.2.5]
Connection: [keep-alive]
Host: [127.0.0.1:9990]
Pragma: [no-cache]
Content-Type: [multipart/form-data; boundary="uuid:04b491f5-50de-4f4f-b7c0-cd745136d3d1"]

--uuid:04b491f5-50de-4f4f-b7c0-cd745136d3d1
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <file>
Content-Disposition: form-data; name="file"; filename=sample.txt

<File content goes here>

Я хочу знать, почему в полезной нагрузке запроса отсутствует заголовок длины содержимого. Есть ли способ установить заголовок длины содержимого для запроса?

Помогите мне, пожалуйста.


person Sudhakar Reddy    schedule 08.10.2018    source источник
comment
Кодировка передачи чанковая, что переопределяет использование Content-Length (в основном используется именно тогда, когда общая длина неизвестна, путем вывода данных несколькими чанками переменного размера, а не одним чанком).   -  person GPI    schedule 08.10.2018
comment
Есть ли способ отключить Transfer_encoding как фрагментированный и заставить клиента добавить заголовок Content-Length?   -  person Sudhakar Reddy    schedule 09.10.2018
comment
Со стороны сервера единственный способ отключить фрагментированное кодирование — это поддерживать только HTTP 1.0, а не HTTP 1.1, что я бы не рекомендовал (причины варьируются от поддержки https/TLS до взаимодействия с возможными прокси-серверами и т. д.). Итак, хотя это возможно, я настоятельно рекомендую вам обойти потребность в Content-Length. Зачем / для чего вам нужна длина содержимого в заголовке?   -  person GPI    schedule 09.10.2018
comment
Поскольку открытый API построен в среде Django. Он не будет принимать фрагментированные данные.   -  person Sudhakar Reddy    schedule 10.10.2018


Ответы (1)


Я использовал apache cxf WebClient, чтобы отключить кодировку передачи как фрагментированную.

if ("POST".equals(method)) {
    Invocation.Builder builder = this.client.getBuilder();
    WebClient.getConfig(builder).getHttpConduit().getClient().setAllowChunking(false);
    response = builder.post(Entity.entity(entity,MediaType.MULTIPART_FORM_DATA));
}

При этом клиент может отправить запрос с заголовком длины содержимого.

person Sudhakar Reddy    schedule 10.10.2018