【问题标题】:How to keep ResponseBody on 204 No Content response?如何将 ResponseBody 保持在 204 No Content 响应?
【发布时间】:2017-11-21 10:02:09
【问题描述】:

我想返回一个204 no content http 状态码。虽然我想添加一个自定义错误消息,提供详细信息为什么没有内容。

问题:我使用的是spring-mvc,当返回HttpStatus.NO_CONTENT 类型时,响应正文总是被删除并且客户端为空!

@RestControllerAdvice
public class ExeptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public Object handler(HttpServletRequest req, Exception e) {
        return new ResponseEntity<String>(e.getMessage(), HttpStatus.NO_CONTENT);
    }
}

如果我将类型更改为 HttpStatus.NOT_FOUND,则错误消息将显示为响应正文。

我怎样才能用 204 达到同样的效果?

【问题讨论】:

  • 您可以在cookie中设置您的值并在客户端从cookie中读取。
  • 2xx 状态码表示成功,因此应该完全没有错误消息。您想用“错误”消息或建议进行响应,这意味着 4xx 可能是更有效的响应,因为这些是客户端错误。

标签: java spring spring-mvc httpresponse


【解决方案1】:

我想返回一个 204 无内容 HTTP 状态代码。虽然我想添加一个自定义错误消息,详细说明为什么没有内容。

你不能。

问题:我使用的是 Spring MVC,当返回 HttpStatus.NO_CONTENT 类型时,响应体总是被删除并且客户端为空!

这是预期的行为。

如果我将类型更改为HttpStatus.NOT_FOUND,则错误消息将显示为响应正文。如何使用 204 达到同样的效果?

204 无法实现。您误解(并且可能滥用)此类状态代码。 204 的目的是表明服务器已成功完成请求,并且响应负载中没有要发送的其他内容

作为参考,请参阅RFC 7231 中如何定义此状态代码:

6.3.5. 204 No Content

204(无内容)状态码表示服务器有 成功完成了请求并且没有额外的 要在响应有效负载正文中发送的内容。 [...]

204 响应被标头后的第一个空行终止 字段,因为它不能包含消息正文。 [...]


根据情况,您最好在响应负载中使用带有空数组的404200。这个answer 可能会给你一些见解。

【讨论】:

    【解决方案2】:

    204 用于成功的请求。它应该不包含错误消息。

    如果发生错误,应使用不同的 HTTP 代码。

    https://httpstatuses.com/204

    一个 204 响应被标头字段之后的第一个空行终止,因为它不能包含消息正文。

    【讨论】:

    • 如果是这样,如果可以为请求找到“无内容”但请求本身完全有效,那么正确的错误消息是什么?例如,如果我想查找以前存在但由于售罄等原因不再可用的库存产品?
    • @membersound 404(读作“四哦四”)错误消息是计算机网络通信中的超文本传输​​协议 (HTTP) 标准响应代码,表示客户端能够与给定的通信服务器,但服务器找不到请求的内容。
    • 好吧,但是如果调用的 servlet 不可用,则返回相同的 404。例如,如果我调用不存在的 localhost:8080/somestuff,我会得到 404。然后,如果我调用 localhost.8080/producs/123 并且找不到产品,404 可能表明 /producs servlet 根本不可用,或者找不到该产品。我想对此有所不同,只为不存在的 servlet 路径保留 404...
    • 如果客户不应该要求不存在的产品,那么 404 是最佳实践 REST 响应。如果存在推测性地要求匹配产品的有效场景,那么最佳实践是有一个返回 list 的查询 URL(例如,在 XML 或 JSON 中),所以如果没有匹配的产品响应为 200,正文为空列表。在 JSON 中{ products = []}
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多