1. REST
说到RESTful,首先要讲REST。
REST,全称为Representational State Transfer,中文翻译为表现层状态转化,是一种设计原则。
要清楚的描述REST其实还少了一个主语,REST说全了,应该是资源的表现层状态转化。英文全称为Resource Representational State Transfer。
资源(Resource):把网络中的一切事物抽象成资源,每一个资源都有一个唯一的定位标识符URL,例如一张图片,一首歌曲,一个视频,一个页面 ...
表现层(Representational):把"资源"具体呈现出来的形式,称为表现层。例如,展示一张图片,播放一首歌曲,播放一首视频,展示一个页面 ...
状态转化(State Transfer):在将"资源"呈现出来之后,用户必会对"资源"产生某种状态的操作,势必会让"资源"的状态发生变化,这个过程就叫做状态转化。
2. REST原则
-
使用REST的URL替换传统URL。
传统URL一般表现为:http://localhost:9000/project/user/findOne?id=1 ,这样的URL实际上是由两个部分组成,第一个部分是URL本体:http://localhost:9000/project/user/findOne,第二个部分是该URL绑定的参数:id=1,两个部分之间使用" ?"相连。该种定位方式被认为URL和参数并不是一个整体,真正的URL:http://localhost:9000/project/user/findOne不能在网络中定义一个唯一的资源。这样就和URL原始制定的标准就有些相悖,URL在制定之初,就规定了URL中不能使用" ?"连接参数。
REST表示的URL,整个URL必须为一个唯一的路径,且整个URL为一个整体,不可分割。使用REST表示上文的URL为:http://localhost:9000/project/user/findOne/1/ 。
-
四种动词对应服务端的四种操作(CRUD,增删改查)。
在没有REST时,我们通常使用GET和POST来前后端通信。GET和POST构建的URL映射到数据库操作可能是select,update,insert,delete。前端发起的请求只有真正到数据库执行sql的时候才知道URL对应的是CRUD中的哪一个操作,在前端表现层而言,我们是不知道对应的是CRUD中的哪一个操作。现在一般都会用具体的英文单词来构成URL,例如 /user/save,我们才能猜出来这是一个insert操作。这样的话,URL和编码的耦合度比较高。
REST提供了四种HTTP的请求动词,代表四种请求方式:GET,POST,PUT,DELETE。REST期望前后端通信时,使用这四种动词,分别代表服务端数据库的四种操作。
GET发出的请求对应的是insert,POST发出的请求对应的是update / insert,PUT发出的请求对应的是insert / update,DELETE发出的请求对应的是delete。
目前主流浏览器只支持GET和POST两种HTTP通信方式,但是很多Java第三方框架(SpringMVC,SpringFlux)却支持REST接口通信,这时使用这些第三方框架搭建的系统在和浏览器通信之前,一般会使用Httpclient或者RPC客户端将REST通信方式转成浏览器可以通信的GET和POST方式,再进行通信。
-
服务接口返回数据的格式通常为JSON或者XML。
-
对于所有REST设计的接口,必须按照设计规定的方式去请求调用。例如设计的接口是PUT接口,那就必须使用PUT的方式去调用。
3. RESTful
RESTful是一种软件架构风格,如果一个架构的设计遵循REST设计原则,那么可以称该架构为RESTful架构。本系列文章所讲的Elasticsearch就是RESTful架构。
4. RESTful在SpringBoot中的实现
GET接口
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("findOne/{id}/{username}/")
public String findOne(@PathVariable("id") String id, @PathVariable("username") String username) {
System.out.println("id:" + id);
System.out.println("username:" + username);
return "ok";
}
}
复制代码
POST/PUT接口
和原始的表单传递方式一致。
@RestController
@RequestMapping("user")
public class UserController {
@PutMapping("saveOne")
public String saveOne(User user) {
System.out.println("user:" + user);
return "ok"
;
}
@PostMapping("updateOne")
public String updateOne(User user) {
System.out.println("user:" + user);
return "ok";
}
}
复制代码
DELETE接口
@RestController
@RequestMapping("user")
public class UserController {
@DeleteMapping("deleteOne/{id}/")
public String deleteOne(@PathVariable("id") String id) {
System.out.println("id:" + id);
return "ok";
}
}
复制代码