这是 return 204 "No Content" 使用 Spring 的正确方法吗?

Is this the correct way to return 204 "No Content" using Spring?

我正在尝试使用 Weblogic 删除资源设置 http 状态 NO_CONTENT,响应需要 30 秒才能完成。我是在滥用 Spring 还是 Weblogic 中存在错误?

我已经在 Weblogic 12.2.1.0.0 上使用 Spring 5.0.12 试过了。请求完成,资源被删除,但客户端等待 30 秒(浏览器 TTFB)之后。这似乎是一种超时。

作为解决方法,我们可以 return http 状态 OK

@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> delete(@PathVariable("id") Long id) {
    useCase.remove(id);
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

我希望客户端立即收到响应,但它等待了 30 秒。

与 200 响应相比,您的 204 响应没有 Content-Length header。尝试手动添加它以查看它是否有助于您的应用程序服务器处理空响应 body:

return ResponseEntity.noContent().header("Content-Length", "0").build();

您也可以使用 @ResponseStatus 注释。

@DeleteMapping(value = "/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public ResponseEntity<Void> delete(@PathVariable("id") Long id) {}

这是 OHS 的一个已知错误。 https://support.oracle.com/knowledge/Middleware/2162306_1.html

错误行为是:插件一直在等待内容主体,而 204 没有主体最终触发读取超时(这是 30+ 秒)。

您需要下载补丁并应用到 OHS,或将 HTTP 代码更改为 解决方法,也许是 202(已接受)。