这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
前言
吃饱饭才有力气写代码~
今天我们来学一学Spring 添加 REST 功能。
一.REST
1.1 REST基本原理
之前对REST的理解是基于URL的Web服务,今天看完书发现这个理解有点片面。首先REST是面向资源的,强调描述应用程序的事物和名次。其次,尽管URL在REST中起到了关键作用,但是它仅仅是整体的一部分而已。
为了理解REST是什么,我们把它的首字母缩写拆分一下:
- Representational 表述性,REST资源实际上可以用各种形式来进行表示,包括XML,JSON(JavaScript Object Notation)甚至HTML,即最适合资源使用者的任意形式。
- State 状态,当使用REST的时候,我们更关注资源的状态而不是对资源采取的行为。
- Transfer 转移,REST涉及转移资源数据,它以某一种表述性形式从一个应用转移到另一个应用。 也就是说,REST把资源的状态以最合适的形式从服务器端转移到客户端或者反之。
1.2 Spring 怎么支持REST
现在Spring支持以下方式来开发REST资源:
- 控制器可以处理所有的HTTP方法,包括四个主要的REST方法:GET、PUT、DELETE以及POST。
- 新的@PathVariable注解使得控制器能够处理参数化的URL(将变量输入作为URL的一部分)。
- Spring的表单绑定JSP标签库的form:form标签以及新的HiddenHttpMethodFilter,使得通过HTML表单提交PUT和DELETE请求成为可能,即便在某些浏览器中不支持这些HTTP方法。
- 通过使用Spring的视图和视图解析器,资源可以以各种形式进行表述,包括将数据模型表现为XML、JSON、Atom和RSS的新视图实现。
- 可以使用新的ContentNegotiatingViewResolver来选择最适合客户端的表述。
- 基于视图渲染可以使用新的@ResponseBody注解和各种HttpMethodConverter实现来达到。
- 类似的,新的@ResponseBody注解和各种HttpMethodConverter实现可以将传入的HTTP数据转化为传入控制器处理方法的Java对象。
- RestTemplate简化了客户端对REST资源的使用。
二.编写面向资源的控制器
2.1 处理RESTful URL
2.1.1 URL
UPL是统一资源定位符的缩写(uniform resource locator),本意是用于定位资源的,此外所有的URL同时也是URI(uniform resource identifier) 统一资源标识符。也就是说我们可以认为任何给定的URL不仅可以定位一个资源,还可以用于标识一个资源。
2.1.2 RESTful URL
http://localhost:8080/Servlet上下文路径/资源类型(名词)/特定的Spittle
其中层级是一个关注重点:
- http://localhost:8080 标识了域和端口号。
- http://localhost:8080/Servlet上下文路径 标识了应用程序的Servlet上下文,这个URL更具体,指明了运行在服务器上的一个应用程序。
- http://localhost:8080/Servlet上下文路径/资源类型 表明了一种资源
- http://localhost:8080/Servlet上下文路径/资源类型(名词)/特定的Spittle 是最精确的URL
2.1.3 执行REST动作
REST是关于资源状态转移的,因此我们需要一些动作来应用于这些资源。最常见的操作是在服务器上对资源进行创建、检索、更新和删除。
- GET 从服务器上检索济源数据,资源通过请求的URL来进行标识
- POST 传送数据到服务器上,数据会由监听该请求URL的处理器来进行处理
- PUT 按照请求的URL,放置资源数据到服务器上 ......
2.2 表述资源
需要了解的是控制器本身通常不关心资源如何表述,控制器以Java对象的方式来处理资源。直到控制器完成了它的工作以后,资源才会被转化为最适合客户端的表达形式。
2.2.1 使用HTTP信息转换器
@RequestMapping(value="/{username}",method=RequestMethod.GET,headers={"Accept=text/xml,application/json"})
public @ResponseBody Spitter getSpitter(@PathVariable String username){
return spitterService.getSpitter(username);
}
@ResponseBody 注解会告知Spring,我们将要返回的对象的对象作为资源发送给客户端,并将其转换为客户端可接收的表述形式。更具体的讲,资源的格式需要满足请求中的Accept头部信息的要求。
对于Accept头部信息,@RequestMapping注解中的headers属性表明这个·1方法只处理Accept头部信息为text/xml或者application/json的请求。其它任何类型的请求,即使它的URL匹配指定的路径并且是GET请求也不会被这个方法处理。