在传递了HttpServletResponse
的spring boot代码片段中,在控制器方法中有一个参数
public void someApiMethod(@RequestBody MyRequest req, HttpServletResponse response) {
//some code
response.setStatus(HttpStatus.NO_CONTENT.value());
}
使用ResponseEntity
可以达到相同的效果,我觉得这里不需要传递HttpServletResponse
。请告知哪种方法是最佳方法,为什么要考虑此代码是为rest API编写的?
答案 0 :(得分:1)
更好的解决方案是使用@ResponseStatus
,因为没有真正的理由在控制器方法中添加非API参数,例如HttpServletResponse
或ResponseEntity
。在大多数情况下,仅路径变量,请求参数,请求正文和标头应为控制器参数集。另外,它更具可读性,可维护性,并且仍可由Swagger等使用。
@ResponseStatus(code = HttpStatus.NO_CONTENT)
public void someApiMethod(@RequestBody MyRequest req) {
//some code
}
答案 1 :(得分:1)
这取决于您的特定用例。
HttpServletResponse
对象的情况下实现用例,请以任何方式进行。这是更清洁的方法。HttpServletResponse
的情况。这样的例子就是您需要将内容 流回客户端的时候,因此您需要直接访问响应输出流。在最新版本的Spring中,也可以通过StreamingResponseBody
来实现,从而避免了直接访问响应输出流的需求。答案 2 :(得分:1)
Spring引导(特别是在这种情况下,Spring MVC是Spring引导的一部分)提供了对Servlet规范一部分的低级HttpResponse的抽象。
简而言之,这种抽象使您无需考虑Http协议,而可以专注于业务逻辑,这是一件好事。
因此,如果您可以避免使用HttpServletResponse
-一定要这样做(这是您在应用程序中通常要做的事情)。
您可以创建对象(如果使用REST,spring会为您转换对象),您可以返回ResponseEntity
,即“ status” +“ body”,spring会进行所有转换。
因此,请首先考虑这些技术。
现在,有时您必须在较低级别上处理响应,在这种情况下,您必须使用HttpServletResponse对象。
如果要返回无法轻松转换的二进制数据,请参见此示例。例如,如果您要准备一个zip文件并作为HTTP请求的结果发送回去,则必须获得更细粒度的低级控件,在这种情况下,最好从HttpServletResponse参数开始传递给控制器方法。
答案 3 :(得分:0)
我认为,返回一个ResponseEntity并根据您的可疑使用它是一种更好的方法。 ResponseEntity更易于处理,更“优雅”的解决方案,与Spring设计更加一致。