本章内容:
编写处理REST资源的控制器;
以XML、JSON及其他格式来表述资源;
编写REST客户端;
提交RESTful表单;
数据为王
REST即 以信息为中心的 表述性状态转移(Representational State Transfer ,REST),已成为替换传统SOAP Web服务的流行方案。REST架构模式中,Spring对REST的支持是构建在SpringMVC之上的。
11.1 了解REST
11.1.1 REST的基本原理
RPC(Remote Procedure Call, 远程过程调用)是面向服务的,并关注于行为和动作;而REST是面向资源的,强调描述应用程序的事物和名词。尽管URL在REST中起了关键作用,但它仅仅是整体的一部分而已。
表述性(Representational) ——REST资源实际上可以用各种形式来进行表述,包括XML、JSON甚至HTML——最适合资源使用者的任意形式。
状态(State) ——当使用REST的时候,我们更关注资源的状态而不是对资源采取的行为。
转移(Transfer)——REST涉及转移资源数据,它以某一种表述性形式从一个应用转移到另一个应用。
更简洁地讲,REST就是将资源的状态以最合适的形式从服务器端转移到客户端(或者反之)。我们尽可能的称之为REST资源。
11.1.2 Spring是如何支持REST的
Spring支持以下方式来开发REST资源:
1) 控制器可处理所有的HTTP方法,包含四个主要的REST方法:GET、PUT、DELETE以及POST;
2) 新的@PathVariable注解使得处理器能够处理参数化的URL(将变量输入作为URL的一部分);
3) Spring的表单绑定JSP标签库的<form:form>标签以及新的HiddenHttpMethodFilter,使得通过HTML表单提交PUT和DELETE请求成为可能,即便在某些浏览器中不支持这些HTTP方法;
4) 通过使用Spring的视图和视图解析器,资源可以以各种形式进行表述,包括将数据模型表现为XML、JSON、Atom和RSS的新视图实现;
5) 可以使用新的ContentNegotiatingViewResolver来选择最适合客户端的表述;
6) 基于视图的渲染可以使用新的@ResponseBody注解和各种HttpMethodConverter实现来达到;
7) 类似地,新的@ResponseBody注解以及HttpMethodConverter实现可以将传入的HTTP数据转化为传入控制器处理方法的java对象;
8) RestTemplate简化了客户端对REST资源的使用。
11.2 编写面向资源的控制器
11.2.1 剖析RESTless的控制器
11.2.2 处理RESTful URL
URL(uniform resource locator)统一资源定位符,所有的URL也都是URI(uniform resource identifier)统一资源标识符。
RESTful URL的特点
在URL中嵌入参数
11.2.3 执行REST动作
使用PUT更新资源
处理DELETE请求
使用POST创建资源
11.3 表述资源
ContentNegotiatingViewResolver 工作 涉及到内容协商的两个步骤:
1. 确定请求的媒体类型
2. 找到适合请求媒体类型的最佳视图
11.3.1 协商资源表述
11.3.2 使用HTTP信息转换器
若要使用这项新技术,首先要将@ResponseBody注解添加到控制器处理方法上。在响应体中返回资源状态。Spring HTTP信息转换器的工作就是,将处理方法返回的Java对象转换为满足客户端要求的表述形式。 在请求体中接收资源状态。
11.4 编写REST客户端
11.4.1 了解RestTemplate的操作
11.4.2 GET 资源(获取)
检索资源
抽取响应的元数据
11.4.3 PUT资源(更新)
11.4.4 DELETE资源(删除)
11.4.5 POST资源数据(新增)
在POST请求中获取响应对象-------postForObject()
在POST请求后获取资源位置------postForLocation()
11.4.6 交换资源
11.5 提交RESTful表单
11.5.1 在JSP中渲染隐藏的方法域
11.5.2 发布真正的请求
11.6 小结
RESTful架构使用Web标准来集成应用程序,使得交互变得简单且自然。系统中的资源采用URL进行标示,使用HTTP方法进行管理,并且会以一种或多种适合客户端的方式来表述。
在本章中,可以看到如何编写响应RESTful资源管理请求的Spring MVC控制器。借助于参数化的URL模式以及将控制器处理方法与特定的HTTP方法关联,控制器能够响应对资源的GET、POST、PUT以及DELETE请求。
为了响应这些请求,Spring能够将资源背后的数据以最适合客户端的形式展现。对于基于视图的响应,ContentNegotiatingViewResolver能够在多个视图解析器产生的视图中选择最适合客户端期望内容类型的那一个。或者控制器的处理方法使用@ResponseBody注解完全绕过视图解析,并使用信息转换器将返回值转换为客户端的响应。
在REST会话的客户端,Spring提供了RestTemplate,可以在Java代码中基于模板的方式使用RESTful资源。如果客户端是基于浏览器的,Spring的HiddenHttpMethodFilter能够弥补Web浏览器不支持PUT和DELETE方法的不足。
尽管本章介绍的RESTful交互与之前介绍的RPC会话有很大的差别,但是他们都有一个共同的特点:它们本质上都是同步的。当客户端发送一个信息,会期望服务器立即响应。与之相反,异步交互允许服务端在时机允许的时候进行响应,而不必立即响应消息。