Можно ли использовать имя файла Content-Disposition для текстовых полей в многокомпонентных формах с помощью Spring Webclient? - PullRequest
0 голосов
/ 01 июня 2019

Для работы с Service-Now API (например) требуется запрос на предоставление следующего:

POST /api/now/attachment/upload HTTP/1.1
Host: somehost.testenv.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MadHyZrFTrZu0gW
cache-control: no-cache
Content-Disposition: form-data; name="table_name"

some_table

Content-Disposition: form-data; name="table_sys_id"

82c9aca7kljasdfkljhasdfec8dfdb61d961920

Content-Disposition: form-data; name="uploadFile"; filename="undefined"

Content-Type: file

------WebKitFormBoundary7MA4YWxkTrZu0gW—

Выше написано с использованием Postman и предоставлением form-data пар ключ-значение.

Однако, основываясь на аннотации RFC, которая определяет Content-Disposition: https://tools.ietf.org/html/rfc2183.

Two values for this
header field are described in this memo; one for the ordinary linear
presentation of the body part, and another to facilitate the use of
mail to transfer files.

Класс Content-Disposition, используемый в Spring Webflux (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ContentDisposition.html) содержит только внутреннийполе для «filename», которое является строкой.

В классе ContentDisposition в org.springframework.http отсутствует компонент согласно RFC-2183 относительно стандартного значения (обычное линейное представление части тела)?

HTTP-запрос, который автоматически генерируется пружинным кодом, выглядит следующим образом:

POST /api/now/attachment/upload HTTP/1.1
user-agent: ReactorNetty/0.7.9.RELEASE
transfer-encoding: chunked
host: somehost.testenv.com
accept: */*
accept-encoding: gzip
Content-Type: multipart/form-data;boundary=o-0JsSvUdGo98NDHJSWTwjvgzlRSXsmJ98-pWQ;charset=UTF-8

Это исходный код, который генерирует указанный выше HTTP-запрос:

MultipartBodyBuilder mbuilder = new MultipartBodyBuilder();
mbuilder.part("table_name", snConfig.getChangeRecordTableName());
mbuilder.part("table_sys_id", result.get(0).getSysId());
mbuilder.part("uploadFile", someFile);

return client.post()
    .uri(snConfig.getEndpointAttachmentUpload())
    .contentType(MediaType.MULTIPART_FORM_DATA)
    .syncBody(mbuilder.build())
    .retrieve()
    .bodyToMono(AttachmentUploadResult.class);

Itпохоже, что код хранит все компоненты MultipartBodyBuilder в одной multipart / form-data, который отличается от формата рабочего запроса HTTP.

Однако, даже вручную предоставляя заголовки Content-Disposition, можно создать только пару имя / значение, где значением является «имя файла».

Отсутствует ли Content-Disposition в функциональности?Возможно ли это с WebClient?

...