Поддержка нескольких частей / связанных MIME-типов в Spring WebClient? - PullRequest
0 голосов
/ 23 февраля 2020

Можно ли делать multipart/related запросы MIME-типа с помощью Spring WebClient?

Я знаю, что это возможно с помощью FormHttpMessageConverter , но при этом используется RestTemplate, я пытался что-то тренировать с WebClient .

Я не совсем уверен, что это правильный метод, но до сих пор я пытался переопределить getWritableMediaTypes метод FormHttpMessageWriter , чтобы включить медиатип multipart/related, и передал экземпляр этого класса в MultipartHttpMessageWriter .

Затем я настроил экземпляр webclient для использования нового экземпляра MultipartHttpMessageWriter, установив ExchangeStrategies.

class MyFormHttpMessageWriter: FormHttpMessageWriter() {

    override fun getWritableMediaTypes(): List<MediaType> {
        return listOf(
            MediaType("multipart","related"),
            MediaType.MULTIPART_FORM_DATA
        )
    }
}
val parts = MultipartBodyBuilder().apply {

part("file",FileSystemResource("/tmp/sample.txt"))
.header("Content-Disposition","attachment; filename=sample.doc name=file")
.contentType(MediaType.APPLICATION_OCTET_STREAM)

part("metadata",Sample(hash="293e838fb1746703bbdc2333f857b969e8b6b4a95c5ca1dcd85296f1352098ab"))
.header("Content-Disposition","form-data; name=metadata")
.contentType(MediaType.APPLICATION_JSON)
}

.build()


    WebClient.builder()
                    .exchangeStrategies(ExchangeStrategies.builder()
            .codecs { clientCodecConfigurer: ClientCodecConfigurer ->
                clientCodecConfigurer.customCodecs()
                    .writer(MultipartHttpMessageWriter(
                    listOf(
                            ResourceHttpMessageWriter(),
                        FormHttpMessageWriter(),
                        EncoderHttpMessageWriter(CharSequenceEncoder.textPlainOnly())
                        ),
                    MyFormHttpMessageWriter()
                ))
            }
            .build())
                    .build()
                    .post()
            .uri("http://locahost:8081/1/file/upload")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType("multipart","related"))
            .body(BodyInserters.fromMultipartData(parts))
            .retrieve()
            .bodyToMono(String::class.java)

Но я получаю следующее исключение:

Caused by: org.springframework.core.codec.CodecException: No suitable writer found for part: metadata
    at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.encodePart(MultipartHttpMessageWriter.java:299) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
...