我正在尝试通过 spring-boot-gateway 上传 (PUT( 一个文件,将请求转发到内部 RestController (参见 DemoController.java(。我能够读取数据,但连接保持打开状态。 网关路由通过 application.yml 进行配置。
演示代码和 curl 请求可以在以下位置找到: https://github.com/knottnhupfer/spring-boot-reactive-gateway-demo
启动 Spring 启动应用程序并调用:
curl --user user:secret -v http://localhost:8080/api/testing/README.md
--upload-file README.md
更新:
同时,我能够读取文件,但服务器端的连接未关闭。这是反应的正常行为,我主动需要关闭连接吗?我意识到用 Mono 包装它会关闭连接,但不再读取数据。
目前,RestController 方法如下所示:
@PutMapping(value = "/{value}/**", consumes = "application/octet-stream")
public Mono<ResponseEntity> putArtifact(ServerHttpRequest request,
@RequestBody ByteArrayResource resource, @PathVariable("value") String value) {
[...]
}
提前感谢
/大卫
简答题
解决方法是在 curl 命令的末尾添加-H 'Expect'
。
详
它是关于 Http 100 继续状态代码。当服务器可能拒绝(可能是因为文件太大(时使用它,然后客户端可以首先向服务器询问请求是否被接受。因此,客户端和服务器都不会浪费时间,例如:由于文件大小而可能被拒绝。
当您发送 PUT 请求时,curl 默认会在请求中添加"期望 100-continue"(如果大小大于某个阈值,也会在 POST 中添加(。在这种情况下,我所期望的服务器将使用 Http 100 响应,但似乎 Spring 云网关可能存在问题
将-H 'Expect'
添加到命令末尾意味着您作为客户端将不再等待来自服务器的 HTTP 100 状态来发送您的请求。但这仍然是一个问题,应该调查其根本原因。可能是因为有 2 台服务器处理 HTTP 100(网关 + 服务器(,客户端以某种方式挂机。这些问题也在本期中提到