Webclient 发送没有正文的 POST 将得到 IllegalStateException

Lun*_*ape 2 java spring-boot spring-webflux

我正在尝试在WebClient没有请求正文的情况下对 api 进行 POST 调用(该 api 不需要正文):

\n\n
webClient.post()\n         .uri("url")\n         .retrieve()\n         .bodyToMono(CustomResponse.class);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但调用返回异常:

\n\n
\n

底层 HTTP 客户端已完成,\n 未发出响应。java.lang.IllegalStateException: 底层 HTTP 客户端已完成,\n 未发出响应。

\n
\n\n

对于另一个需要请求正文的 API,我可以成功地进行 POST 调用,没有任何问题:

\n\n
webClient.post()\n         .uri("url")\n         .bodyValue("value")\n         .retrieve()\n         .bodyToMono(CustomResponse.class);\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是否与 WebClient\xe2\x80\x99s 请求正文有关?我如何解决它?

\n\n

更新

\n\n

发生错误的原因是我ContentType通过 添加了 Webclient 的标头.defaultHeader("ContentType", JSON)。\n删除标头后问题就消失了。

\n

Ste*_*ski 5

看起来下游 Web 服务响应太慢并且超过连接超时,因此您会遇到此问题。

如果您不需要(或者响应没有正文),您可以使用.toBodilessEntity()它。所以你的代码片段可以重写:

webClient.post()
         .uri("url")
         .retrieve()
         .toBodilessEntity();
Run Code Online (Sandbox Code Playgroud)

为什么要使用它?因为你始终负责资源的释放。请阅读“注意”部分

使用Exchange()时,应用程序有责任消费任何响应内容,无论场景如何(成功、错误、意外数据等)。不这样做可能会导致内存泄漏。有关使用主体的所有可用选项的列表,请参阅ClientResponse 。

  • 结果我为我的网络客户端添加了一个“ContentType”默认标头。 (2认同)