尝试通过弹簧云网关和 RestController 上传文件



我正在尝试通过 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(网关 + 服务器(,客户端以某种方式挂机。这些问题也在本期中提到

相关内容

  • 没有找到相关文章

最新更新