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 方法,例如 GETPUTPOST 删除

而且我知道请求是通过在处理资源操作的方法上使用@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 注释究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理restful对接口安全性问题

RESTful API 设计指南

RESTful

实现一个符合 RESTful 架构的程序

restful风格

RESTful 用户认证服务