REST定义
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如Web应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
Restful的特性
优点:它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。
比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
使用Restful风格
在 Spring 3.0 以后,Spring 这对 SpringMVC 的一些增强功能对 RESTful 提供了良好的支持。在4.0后的版本中,Spring支持以下方式创建REST资源:
-
控制器可以处理所有的HTTP方法,包含几个主要的REST方法:GET、POST、PUT、DELETE、PATCH;
-
借助 @PathVariable 注解,控制器能够处理参数化的URL(将变量输入作为URL的一部分);
-
借助Spring的视图解析器,资源能够以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom、以及 RSS 的 View 实现;
-
可以使用 ContentNegotiatingViewResolver 来选择最适合客户端的表述;
-
借助 @ResponseBody 注解和各种 HttpMethodConverter 实现,能够替换基于视图的渲染方式;
-
类似地,@RequestBody 注解以及 HttpMethodConverter 实现可以将传入的HTTP数据转化为传入控制器处理方法的Java对象;
-
借助 RestTemplate,Spring 应用能够方便地使用 REST 资源。
@PathVaribale注解
作用:用于绑定URL中的占位符。
例如:请求URL中 /delete/{id}
,这个{id}
就是URL占位符。
URL支持占位符是 Spring3.0 之后加入的。是SpringMVC支持REST风格URL的一个重要标志。
属性:value:用于指定URL中占位符名称;required:是否必须提供占位符。
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
使用简化的注解
@RequestMapping(value = "/user/", method = RequestMethod.GET)
此时可以使用@GetMapping("/user/")来简化这两个注解。
同理,请求方式不同,对应注解也不同:@PostMapping、@PutMapping、@DeleteMapping
使用 @RequestBody 注解实现在请求体中接收资源状态
使用 @RequestBody 注解可以告知Spring查找一个消息转换器,将来自客户端的资源表述转换为对象。如:
@RequestMapping(value = "/save", method = RequestMethod.POST,
produces = { "application/json;charset=UTF-8" })
public int saveEmploy(@RequestBody EmployeeEntity employeeEntity) {
return empService.save(employeeEntity);
}
使用 @RestController 注解为控制器默认设置消息转换
Spring 4.0 引入了 @RestController 注解,在控制器是用 @RestController 代替 @Controller 的话,Spring 将会为该控制器的所有处理方法应用消息转换功能。我们不必在每个方法都添加 @ResponseBody 注解了。
为客户端提供其他元数据
使用ResponseEntity提供更多响应相关的元数据
可以利用 ResponseEntity 给客户端返回状态码、设置响应头信息等,如给客户端提供返回码:
@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
public ResponseEntity<EmployeeEntity> employById(@PathVariable long id) {
HttpStatus status = null;
EmployeeEntity employeeEntity = empService.selectById(id);
if (employeeEntity != null) {
status = HttpStatus.OK;
} else {
status = HttpStatus.NOT_FOUND;
}
return new ResponseEntity<EmployeeEntity>(employeeEntity, status);
}
//如果没有if判断,当根据id找不到对应的信息的时候,返回给客户端的状态码是默认的HttpStatus.OK;
//当加上了判断条件后如果没有相应的信息返回则设置返回状态码为HttpStatus.NOT_FOUND,
//最后通过new一个ResponseEntity会将查询信息和状态码一起返回到客户端。
过滤器支持PUT和DELETE请求
<!--restful风格过滤器-->
<filter>
<filter-name >hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name >hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
RestTemplate API
RestTemplate定义了36种与REST资源交互的形式(其实只有11个独立的方法,10个被重载了3次,另外一个被重载了6次),其中大多数都对应于HTTP的方法。
大多数HTTP方法都以三种方法进行了重载:
//1. 一个使用String作为URL格式,并使用可变参数列表指明URL参数。
//url参数指定访问的地址,
//responseType参数定义该方法的返回类型,
//urlVariables参数为url中占位符对应的参数。
getForObject (String url, Class responseType, Object... urlVariables)
//2. 一个使用String作为URL格式,并使用Map指明URL参数。
//在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,
//因此使用时在url中需要将占位符的名称与Map类型中的key一一对应设置。
getForObject(String url, Class responseType, Map urlVariables)
//3. 一个使用java.net.URL作为URL格式,不支持参数化URL;
//使用URI对象来替代之前的url和urlVariables参数使用。
getForObject(URI url, Class responseType)
RestTemplate定义了11个独立的操作,而每一个都有重载,这样一共是36个方法 :
-
postForEntity() :POST数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的。
-
postForLocation() :POST数据到一个URL,返回新创建资源的URL。
-
postForObject() :POST数据到一个URL,返回根据响应体匹配形成的对象。
需要注意的是新增加的 request 参数,该参数可以是一个普通对象,也可以是一个 HttpEntity 对象。
如果是一个普通对象,而非 HttpEntity 对象的时候,RestTemplate会将请求对象转换为一个 HttpEntity 对象来处理,其中Object就是request的类型,request内容会被视作完整的body来处理;如果 request 是一个HttpEntity对象,那么就会被当作一个完成的 HTTP 请求对象来处理,这个 request 中不仅包含了 body 的内容, 也包含了 header 的内容。
postForObject(String url, Object request, Class responseType, Map uriVariables)
-
delete() :在特定的URL上对资源执行HTTP DELETE操作。
-
put() :PUT资源到特定的URL。
-
getForEntity() :发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象。
-
getForObject() :发送一个HTTP GET请求,返回的请求体将映射为一个对象。
-
headForHeaders() :发送HTTP HEAD请求,返回包含特定资源URL的HTTP头。
-
optionsForAllow() :发送HTTP OPTIONS请求,返回对特定URL的Allow头信息。
-
exchange() :在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的。
-
execute() :在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象。
在实际的开发中一般使用Web Services和SpringMVC相结合的方式。
评论区