禁用传输编码:在 Spring Webflux 响应中分块

Posted

技术标签:

【中文标题】禁用传输编码:在 Spring Webflux 响应中分块【英文标题】:Disable transfer-encoding: chunked in Spring Webflux responses 【发布时间】:2018-07-12 11:55:36 【问题描述】:

我使用 Spring Webflux 响应式库创建了一堆 REST API 端点。我现在面临的问题是 Spring Webflux 返回的响应具有 transfer-encoding: chunked HTTP 标头。由于哪个客户端应用程序使用像 Axios (https://github.com/axios/axios) 这样的库,来自浏览器 javascript 的基于承诺的 HTTP 客户端失败了。我们如何关闭 transfer-encoding: chunked

使用 curl 的 Spring webflux 应用程序响应示例:

< HTTP/1.1 200 OK
< transfer-encoding: chunked
< Content-Type: application/json;charset=UTF-8
<
["default_project_id":"admin","description" .......
"name":**"use* Connection #0 to host 10.1.0.9 left intact**
r1","links":"self":"http://10.10.10.51:5000/v3/users/f6ee9d6217404d2ba73f323edff06bf8",
"password_expires_at":null,
"id":"f6ee9d6217404d2ba73f323edff06bf8"]

请帮忙。我看到了整个响应,但是响应的分块正在抛弃 http 客户端库,尤其是从 Web 浏览器中消耗它们。

【问题讨论】:

【参考方案1】:

我认为您不能使用 Reactor Netty(Spring Boot + WebFlux 使用的默认服务器)禁用分块编码。另一种方法是设置Content-Length 标头,这意味着在将整个响应写入网络之前对其进行缓冲。这对于背压支持来说并不是最佳选择。

我查看了 axios 客户端,我只找到了一个opened issue about HTTP streaming support,它与Transfer-Encoding: chunked 不同。您能否详细说明您是如何得出这个结论的?

【讨论】:

以上是关于禁用传输编码:在 Spring Webflux 响应中分块的主要内容,如果未能解决你的问题,请参考以下文章

将 spring-security 与 spring-webflux 一起使用时禁用 WebSession 创建

Webflux禁用特定URL上的CSRF

Spring WebFlux 没有流式响应

如何使用 Webflux 在 Spring API 处理程序方法中访问 JWT 声明?

如何禁用传输编码:chunked websphere

Spring WebFlux 反应式 WebSocket 防止连接关闭