一、RESTFul简介
REST:Representational State Transfer,表现层资源状态转移。
a>资源
部署在服务器(例如tomcat)上的所有内容都叫做资源
资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。
b>资源的表述
资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种例如HTML/XML/JSON/纯文本/图片/视频/音频等格式。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。
c>状态转移
客户端与服务器端怎么进行转移?就是浏览器发送请求到服务器,请求的是什么,服务器就要响应什么,这时就要将我们服务器上的资源转移到当前的客户端。
状态转移说的是:在客户端和服务器端之间转移(transfer)代表资源状态的表述。通过转移和操作资源的表述,来间接实现操作资源的目的。
2、RESTful的实现
具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET(对应查询)、POST(对应添加)、PUT(对应修改)、DELETE(对应删除)。
URL,统一资源标识符,就是用一个标识符,标识了客户端对该资源的各种操作,只要是对同一个资源的操作,请求地址都可以用同一个URL,只是用HTTP的不同请求方式来区分对该资源的不同具体操作。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。
操作 | 传统方式 | REST风格 |
---|---|---|
查询操作 | getUserById?id=1 | user/1–>get请求方式 |
保存操作 | saveUser | user–>post请求方式 |
删除操作 | deleteUser?id=1 | user/1–>delete请求方式 |
更新操作 | updateUser | user–>put请求方式 |
GET方式用超链接,表单方式提交都可以,POST用表单提交。
而PUT与DELETE在SpringMVC中提供了过滤器的方式
想让过滤器生效首先要在web.xml中进行注册
<!--配置HiddenHttpMethodFilter-->
<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>
HiddenHttpMethodFilter源码中就是把原来请求的请求方式替换掉了,写个隐藏表单,里面写个name为_method,value为put或delete,然后表单外面的提交方式设置为post,就能被过滤器过滤到,通过这个方法把提交方式替换
要想发送put与delete请求必须要有两个条件,form表单中一是必须请求方式为post,二是必须有input出请求参数_method,因为这个对于用户没有意义,所以要用隐藏域hidden。
例子:(value中的put大小写都可以)
</form>
<form th:action="@{/user}" method="post">
<input type="hidden" name="_method" value="PUT">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="修改"><br>
</form>
问题:(DELETE)删除一般用的都是超链接,但是这边是一个form表单,要怎么处理呢?
通过vue,在超链接上绑定一个点击事件,在点击事件里面先阻止超链接的默认行为(跳转),然后再获得当前的某一个表单,这个表单里面不需要有任何数据,只需要把请求方式设置为post,再写一个隐藏域,name=_method,value=delete.不需要写提交按钮,因为目的就是要通过超链接控制表单的提交。