Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 缺少使用WebClient发送POST请求的内容长度标头(SpringBoot 2.0.2.RELEASE)_Spring Boot_Spring Webflux - Fatal编程技术网

Spring boot 缺少使用WebClient发送POST请求的内容长度标头(SpringBoot 2.0.2.RELEASE)

Spring boot 缺少使用WebClient发送POST请求的内容长度标头(SpringBoot 2.0.2.RELEASE),spring-boot,spring-webflux,Spring Boot,Spring Webflux,我正在使用WebClient(SpringBoot 2.0.2.RELEASE)发送带有SOAP请求的帖子,但它缺少旧式API所需的“内容长度”标题 是否可以将WebClient配置为包含“内容长度”标题? SpringBoot 2.0.1中为EncoderHttpMessageWriter解决并引入了一个问题,但它似乎不适用于JAXB 我尝试使用车身插入器: webClient.post().body(BodyInserters.fromObject(request)).exchange();

我正在使用WebClient(SpringBoot 2.0.2.RELEASE)发送带有SOAP请求的帖子,但它缺少旧式API所需的“内容长度”标题

是否可以将WebClient配置为包含“内容长度”标题? SpringBoot 2.0.1中为EncoderHttpMessageWriter解决并引入了一个问题,但它似乎不适用于JAXB

我尝试使用
车身插入器

webClient.post().body(BodyInserters.fromObject(request)).exchange();
syncBody

webClient.post().syncBody(request).exchange();

他们都不是为
WebClient
工作的。尽管如此,当使用
restemplate
时,设置了内容长度,API成功响应

我也遇到了同样的问题,因为我正在手动序列化请求(在我的例子中是JSON)并设置长度(Kotlin代码):

使用411errorfix打开类PostRetriever(
私有val对象映射器:对象映射器
) {
受保护的趣味帖子(webClient:webClient,body:Any,responseClass:Class):Mono{
val bodyJson=objectMapper.writeValueAsString(正文)
返回webClient.post()
.contentType(MediaType.APPLICATION\u JSON\u UTF8)
.contentLength(bodyJson.toByteArray(Charset.forName(“UTF-8”))).size.toLong()
.syncBody(bodyJson)
.retrieve()
.bodyToMono(响应类)
}
}

WebClient
是一个流式客户端,在流结束之前很难设置内容长度。到那时,标题早已消失。如果使用legacy,可以重用mono(mono/Flux可以重用,Java streams不能重用),并检查长度

public void post(){
Mono=Mono.just(“HELLO WORLDZ”);
最终字符串响应=WebClient.create(“http://httpbin.org")
.post()
.uri(“/post”)
.header(HttpHeaders.CONTENT_长度,
mono.map(s->String.valueOf(s.getBytes(StandardCharsets.UTF_8.length)).block()
.body(BodyInserters.fromPublisher(mono,String.class))
.retrieve()
.bodyToMono(String.class)
.block();
System.out.println(响应);
}
我的一位同事(做得很好,Max!)提出了更干净的解决方案,我添加了一些包装代码,以便可以对其进行测试:

Mono my=Mono.just(“你好,WORLDZZ”)
.flatMap(主体->网络客户端.create(“http://httpbin.org")
.post()
.uri(“/post”)
.header(HttpHeaders.CONTENT_长度,
String.valueOf(body.getBytes(StandardCharsets.UTF_8.length))
.syncBody(body)
.retrieve()
.bodytomino(String.class));
System.out.println(my.block());

如果您像我们一样应用Sven的同事(Max)解决方案,您也可以将其应用于像您的身体是定制obj这样的情况,但您必须将其序列化一次:

String req = objectMapper.writeValueAsString(requestObject)
然后把它传给了

webClient.syncBody(req)
请记住,在SpringBoot 2.0.3.RELEASE中,如果您将字符串作为请求传递给webClient,它将作为ContentType标头MediaType.TEXT_PLAIN,这使得我们与其他服务的集成失败。我们通过如下设置特定的内容类型标题来修复此问题:

httpHeaders.setContentType(MediaType.APPLICATION_JSON);

看来这是目前唯一的办法。经过一些研究,似乎无法使用当前的webflux实现添加此标头。这只适用于纯字符串体,而不适用于映射对象,如POJO到JSON,或者是吗?2018年以来有一个回答回答了您的问题……即使是brebDev的回答也不能回答这样的情况,即您只是使用WebClient
.syncBody(myPojo)
的自动映射功能将Pojo作为syncBody传递,因为在这种情况下,我无法知道序列化将包含多少字符,或者我可以吗?还是显式映射是唯一的出路?很抱歉,我的第一个问题的表述过于草率。简单的解决方法:使用2.2或更高版本。问题已经解决:2019年
httpHeaders.setContentType(MediaType.APPLICATION_JSON);