【问题标题】:Latest Spring Boot [2.5.0] webclient bug?最新的 Spring Boot [2.5.0] webclient 错误?
【发布时间】:2021-10-13 19:16:56
【问题描述】:
我最近将我的项目升级到最新版本的 spring-boot 2.5.0 并着手重构大量已弃用的代码。我注意到 awaitExchange() 现在已被弃用,应替换为 awaitExchange{it}
但是,一旦我将一个替换为另一个,我似乎无法再通过 response.awaitBody() 在另一个类中从 ClientResponse 对象中提取正文并继续获取 No value received via onNext for awaitSingle。这种行为是设计使然吗?
有没有其他方法可以真正抓住身体而不必使用`
awaitExchange{ it.awaitBody() } 在进行 web 服务调用的类中?
【问题讨论】:
标签:
java
spring-boot
kotlin
spring-webflux
spring-webclient
【解决方案1】:
由于您没有显示您的代码,因此很难说出问题所在。但是你可以通过以下方式使用WebClient
val client = WebClient.create()
val data: MultiValueMap<String, String> = LinkedMultiValueMap()
data["username"] = "johndoe"
data["target_site"] = "aloha"
client.create()
.post()
.uri("some uri")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(BodyInserters.fromFormData(data))
.retrieve()
.awaitBodyOrNull<String>() ?: throw Exception("Received null response")
另一种方法是
val response = client.get()
.uri("some uri")
.contentType(MediaType.APPLICATION_JSON)
.retrieve()
.toEntity(String::class.java)
.awaitSingle()
if (!response.statusCode.is2xxSuccessful) {
throw Exception("Received ${response.statusCodeValue} response.")
}