RESTful 应用程序的 @ResponseStatus Spring 注释究竟是如何工作的?
Posted
技术标签:
【中文标题】RESTful 应用程序的 @ResponseStatus Spring 注释究竟是如何工作的?【英文标题】:How exactly works the @ResponseStatus Spring annotation for RESTful application? 【发布时间】:2015-04-08 09:29:09 【问题描述】:我正在学习 Spring Core 认证,我对 Spring 如何处理 REST 请求有一些疑问。
我知道,使用 REST,资源会以名称的形式公开,并且对这些资源的操作是 HTTP 方法,例如 GET、PUT、POST 和 删除。
而且我知道请求是通过在处理资源操作的方法上使用@RequestMapping
注释来处理的。
据我了解,标准 Web 应用程序和 RESTful 应用程序都使用一些代码与它们的客户端通信(RESTful 应用程序有一组扩展的代码),我认为这些代码代表了请求的状态(例如 200是请求是成功的GET返回内容等)。
现在文档显示了 @ResponseStatus
注释的用法,如本例所示:
@RequestMapping(value="/orders", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED) // 201
public void createOrder(HttpServletRequest request, HttpServletResponse response)
Order order = createOrder(request);
// determine full URI for newly created Order based on request
response.addHeader("Location",
getLocationForChildResource(request, order.getId()));
所以看看前面的方法,我知道它处理 HttpRequest POST 对名为 /orders 的资源的请求(使用 REST,资源被视为 URL,是对吗?)。
但是下面的注解到底是做什么的:
@ResponseStatus(HttpStatus.CREATED) // 201
我知道 201 状态码表示 在 POST 上创建了新资源。
查看我可以阅读的官方文档:
用状态码和原因标记方法或异常类 应该退回。状态码应用于 HTTP 响应 调用处理程序方法时,或每当所述异常发生时 扔了。
那么它到底是什么意思呢?我认为就像在前面的示例中所做的那样,它设置了 201 状态,表示资源是由 POST 请求正确创建的。如果这是正确的,我有 2 个问题:
资源是 /orders URI。那么创造了什么?一个名为 orders 的文件(我认为这个断言是错误的)还是什么?
201状态放在哪里?
【问题讨论】:
我认为在学习Spring之前,你应该学习HTTP的基础知识。每个 HTTP 响应都有一个状态。 200 表示正常。 201 的意思是“你要求创造一些东西,而我做到了”。在这种情况下,如方法名称所示,已创建订单。 【参考方案1】:201 是HTTP status code。这表明
请求已完成并导致创建新资源。
因此,如果您的服务器正在返回这样的状态代码,那么客户端就会知道创建了一些(概念上的)资源。该资源是什么是你的责任,你是服务器。
状态码是HTTP response status line.的一部分
【讨论】:
好的,你是说@ResponseStatus 注解只在HTTP 响应状态行中加入了一个状态? @AndreaNobili 是的,它向 Spring 指示带注释的处理程序应该生成带有给定状态代码的 HTTP 响应。以上是关于RESTful 应用程序的 @ResponseStatus Spring 注释究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章