Java 如何使用WebClient反应式web客户端通过zip正文发送POST请求

Java 如何使用WebClient反应式web客户端通过zip正文发送POST请求,java,spring-boot,Java,Spring Boot,如何使用WebClient反应式web客户端发布带有ZIP(压缩数据)正文的请求 我在内存中创建了一个zip(bytearrayoutputstream),并希望使用WebClient反应式web客户端在POST请求正文中发送zip数据。RESTAPI是一个PdfReactor REST Web服务。响应是二进制数据(pdf) 调试代码时,出现以下错误: 池连接观察到错误 org.springframework.web.reactive.function.UnsupportedMediaType

如何使用WebClient反应式web客户端发布带有ZIP(压缩数据)正文的请求

我在内存中创建了一个zip(bytearrayoutputstream),并希望使用WebClient反应式web客户端在POST请求正文中发送zip数据。RESTAPI是一个PdfReactor REST Web服务。响应是二进制数据(pdf)

调试代码时,出现以下错误: 池连接观察到错误

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/octet-stream' not supported for bodyType=java.io.ByteArrayInputStream
    at org.springframework.web.reactive.function.BodyInserters.unsupportedError(BodyInserters.java:297) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.reactive.function.BodyInserters.lambda$writeWithMessageWriters$9(BodyInserters.java:287) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at java.base/java.util.Optional.orElseGet(Optional.java:358) ~[na:na]
    at org.springframework.web.reactive.function.BodyInserters.writeWithMessageWriters(BodyInserters.java:287) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.reactive.function.BodyInserters.lambda$fromObject$1(BodyInserters.java:85) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.reactive.function.client.DefaultClientRequestBuilder$BodyInserterRequest.writeTo(DefaultClientRequestBuilder.java:257) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$exchange$1(ExchangeFunctions.java:103) ~[spring-webflux-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.http.client.reactive.ReactorClientHttpConnector.lambda$connect$2(ReactorClientHttpConnector.java:110) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:528) ~[reactor-netty-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    at reactor.netty.http.client.HttpClientConnect$HttpObserver.lambda$onStateChange$0(HttpClientConnect.java:396) [reactor-netty-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) ~[reactor-core-3.2.2.RELEASE.jar:3.2.2.RELEASE]
    at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:76) [reactor-core-3.2.2.RELEASE.jar:3.2.2.RELEASE]
    at reactor.netty.http.client.HttpClientConnect$HttpObserver.onStateChange(HttpClientConnect.java:397) [reactor-netty-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onStateChange(PooledConnectionProvider.java:501) [reactor-netty-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.run(PooledConnectionProvider.java:531) [reactor-netty-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) [netty-transport-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar:4.1.29.Final]
    at java.base/java.lang.Thread.run(Thread.java:844) [na:na]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    |_  Mono.error ⇢ org.springframework.web.reactive.function.BodyInserters.lambda$writeWithMessageWriters$9(BodyInserters.java:287)
    |_  Mono.defer ⇢ reactor.netty.http.client.HttpClientConnect$HttpObserver.onStateChange(HttpClientConnect.java:396)
configuration.json:
{
“文档”:“test.html”,
“addBookmarks”:正确,
“addLinks”:正确
}
test.html:
你好,这是我的测试。
map.put(模板,tempBytesArray);
map.put(配置,configByteArray);
try(ByteArrayOutputStream bos=newbytearrayoutputstream()){
try(ZipOutputStream zos=新的zipoutpstream(bos)){
图.forEach((k,v)->{
var zipentry=新zipentry(k);
试一试{
佐斯·普特内森特里(齐彭特里);
zos_.write(v);
zos_.closeEntry();
}捕获(IOE异常){
e、 printStackTrace();
}
});
字节[]b=bos.toByteArray();
BodyInserter BodyInserter=BodyInserters.fromObject(bos);
byteArray=pdfRecactorClient
.post()
.uri(pdfReactorUrl+PDF\u REACTOR\u URL\u后缀)
.accept(MediaType.APPLICATION\u八位字节\u流)
.body(BodyInserters.fromObject(bos)
.exchange()
.flatMap(response->response.bodyToMono(ByteArrayResource.class))
.map(ByteArray资源::getByteArray)
.block();
zos_.close();
}捕获(例外e){
//TODO:处理异常
}
如果在命令行上执行以下CURL,则得到结果pdf:

curl-X POST-H“缓存控制:无缓存”-H“内容类型:application/zip”--data binary@test.gzip”http://localhost:8080/service/rest/convert.pdf“>result.pdf

同样的内容也应该翻译成Java反应式代码。问题出在PDFReactor的请求正文(Zip/asset package)上。请帮忙

PDF的内容类型为MediaType.APPLICATION\u PDF

更改内容类型,如下所示

                    pdfReactorClient
                        .post()
                        .uri(pdfReactorUrl + PDF_REACTOR_URL_SUFFIX)
                        .accept(MediaType.APPLICATION_PDF)
PDF的内容类型为MediaType.APPLICATION\u PDF

更改内容类型,如下所示

                    pdfReactorClient
                        .post()
                        .uri(pdfReactorUrl + PDF_REACTOR_URL_SUFFIX)
                        .accept(MediaType.APPLICATION_PDF)

您复制和粘贴的日志太大,例如,它包含与tomcat start无关的信息。您能更具体地说明日志中的错误吗?您复制和粘贴的日志太大,例如,它包含与tomcat start无关的信息。您能更具体地说明日志中的错误吗?嗨,Pablo&Bara您好,Pablo&Barath,我已将接受媒体类型更改为您的建议:.post().uri(pdfReactorUrl+PDF\u REACTOR\u URL\u后缀)。接受(MediaType.APPLICATION_PDF).body(BodyInserters.fromObject(bos))但它复制了一个错误:bodyType=java.io.ByteArrayInputStreamer不支持内容类型“APPLICATION/octet stream”:| Mono.error⇢ org.springframework.web.reactive.function.BodyInserters.lambda$writeWithMessageWriters$9(BodyInserters.java:287)| uuMono.defer⇢ reactor.netty.http.client.HttpClientConnect$HttpObserver.onStateChange(HttpClientConnect.java:396)嗨,Pablo&Barath,嗨,Pablo&Barath,我将接受媒体类型更改为您的建议:.post().uri(pdfReactorUrl+PDF\u REACTOR\u URL\u后缀).accept(MediaType.APPLICATION\u PDF).body(BodyInserters.fromObject(bos))但它再现了正常错误:bodyType=java.io不支持内容类型“application/octet stream”。以下操作员观察到ByteArrayInputStreamError:|Mono.error⇢ org.springframework.web.reactive.function.BodyInserters.lambda$writeWithMessageWriters$9(BodyInserters.java:287)| uuMono.defer⇢ reactor.netty.http.client.HttpClientConnect$HttpObserver.onStateChange(HttpClientConnect.java:396)
                    pdfReactorClient
                        .post()
                        .uri(pdfReactorUrl + PDF_REACTOR_URL_SUFFIX)
                        .accept(MediaType.APPLICATION_PDF)