文章目录
RESTful
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
概述
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。
Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。
分层系统
另一个重要的 REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。
当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST 简化了客户端和服务器的实现。
Spring5中对RESTful风格的支持
在Spring5中RESTful请求方式
在Spring5中,其对RESTful风格的支持一共有两种方式,其一是比较传统的方式。即:
@RequestMapping(value = "/...",method = RequestMethod.GET)
在RequestMethod
中封装了大量的请求方式,如:GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE。而我们经常操作的就是对数据的增删改查操作,即我们经常使用的请求方式为:GET,POST,PUT,DELETE共四种请求方式。
其中GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
而为了方便书写,Spring5为我们提供了一些简写的书写方式,如:
@GetMapping("/...")
@PostMapping("/...")
@PutMapping("/...")
@DeleteMapping("/...")
...
上述两种方式无论用哪种都是合适的,而从操作的简便方面来说,我建议还是使用后者。
在Spring5中返回请求的数据
而对于请求数据的返回,以前使用的是@Controller
加@ResponseBody
,在新的Spring5中,其将两者进行了整合,此时我们可以将其简写为@RestController
,这里我们依然是推荐使用后者。
注意事项
在Spring5中添加对put请求方式的支持
在默认的情况下,Spring是不建议使用RESTful的请求方式的,所以说如果我们在前台中使用put方式进行传参,那么我们在后台中会出现接收不到请求参数的情况,此时如果我们想要在后台中接受到前台请求的参数,那么我们得在应用程序的web.xml文件中添加Spring对put方法的支持,即添加下面的过滤器:
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring5中的删除方法
由于在Spring5中只存在PUT的HttpPutFormContentFilter,而并不存在DELETE的相关Filter,因而在前端通过ajax的DELETE方式请求时,默认其请求参数是无法被Spring5接收的,而其数据如果要想被Spring5接收,那么其只能写入url的请求路径中,比如说我们想向后台传递参数为1的删除操作,我们的前台请求路径可以是这样的:
/acl/1
其后台接收采用Spring5中的@PathVariable
,其接收路径是这样的:
/acl/{id}
...(@PathVariable("id") int id)
通过上述方式我们就能够成功的获取到前台传入后台的数据
jQuery的注意事项
我们在前台提交请求的时候往往是采用jQuery来进行提交,而在jQuery中,其建议使用的请求方式一共有两种,其一是get,其二便是post,即我们可以通过下面的方式来向后台请求数据:
$.get(url,[data],[fn],[type])
$.post(url,[data],[fn],[type])
而如果我们按照习惯,在使用put方法时,我们以$.put
开头,那样就会出错,因为在jQuery中并没有该方法。而我们如果想采用jQuery的put方式请求,那么我们得这样进行操作:
$.ajax({
url : '请求路径'
,data : '请求参数'
,type : 'put' //提交方式,这里与Spring5中接受的方式相同,故可以使用put等方式进行提交
,success : function(res){
...
}
});
Spring5中的HiddenHttpMethodFilter过滤器
该种方式是添加下面的过滤器
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其后台支持PUT,DELETE方法以及其参数的过程其实也是在前台采用POST的方式进行数据提交的,而其不同之处就在于,其在POST提交的同时还会传递额外的参数,比如说传递参数_method:"PUT"
或_method:"DELETE"
,这样后台的@PutMapping
,@DeleteMapping
就可以接收到相应的参数了。
请求方式的幂等性
什么是幂等性
每次HTTP请求相同的参数,相同的URL,产生的结果是相同的。
RESTful常用方法的幂等性
在常用的四种RESTful请求方式中,GET,PUT,DELETE由于每一次提交,其对资源产生的影响都是相同的,所以说他们都满足幂等性。而POST提交由于每次请求其都会重新产生新的资源,故不满足幂等性。因此我们一般插入数据时采用POST,修改数据时采用PUT。
参考资源: RESTful