Restfull API 介绍 + 示例
什么是Restfull API?
它是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。分别对应 添加、删除、修改、查询。
对比下:
传统方式操作资源:
http://127.0.0.1/item/queryUser.action?id=1 查询,GET
http://127.0.0.1/item/saveUser.action 新增,POST
http://127.0.0.1/item/.action 更新,POST
http://127.0.0.1/item/deleteupdateUserUser.action?id=1 删除,GET或POST
使用RESTful操作资源:
【GET】 /users/1001 # 查看某个用户信息
【POST】 /users # 新建用户信息
【PUT】 /users/1001 # 更新用户信息(全部字段)
【DELETE】 /users/1001 # 删除用户信息
这样坐下对比,我们发现可以使用RESTful规范来定义请求资源的路径变得更为简洁明了。
规范定义为如下几点:
1.使用名词而不是动词
也就是不要再使用:
/getAllUsers
/createNewUser
/deleteAllUser
2.Get方法和查询参数不应该涉及状态改变
使用PUT, POST 和DELETE 方法 而不是 GET 方法来改变状态,不要使用GET 进行状态改变
3.使用复数名词
不要混淆名词单数和复数,为了保持简单,只对所有资源使用复数。
/cars 而不是 /car
/users 而不是 /user
/products 而不是 /product
/settings 而部署 /setting
4.使用子资源表达关系
如果一个资源与另外一个资源有关系,使用子资源:
GET /cars/711/drivers/ 返回 car 711的所有司机
GET /cars/711/drivers/4 返回 car 711的4号司机
5.使用Http头声明序列化格式
在客户端和服务端,双方都要知道通讯的格式,格式在HTTP-Header中指定
Content-Type 定义请求格式(我们通常用application/json)
Accept 定义系列可接受的响应格式
…
理解:
Restfull API 从字面就可以知道,他是rest式的接口,所以就要先了解什么是rest rest 不是一个技术,也不是一个协议
rest 指的是一组架构约束条件和原则,提供了一个新的架构设计思路,满足这些约束条件和原则的应用程序或设计就是 RESTful
在REST规则中,有两个基础概念:对象、行为 对象就是我们要操作的对象,例如添加用户的操作,那么对象就是user
行为有4种常用的:查看、创建、编辑、删除 rest的提出者很巧妙的利用http现有方法来对应这4种行为: GET - 查看 POST -
创建 PUT - 编辑 DELETE - 删除
为什么用Restfull API?
例如常用的MVC结构中,前后端的融合还是比较紧密的,用户访问一个网址,例如
http://test.com/a.php,请求先发送到动态php处理,php中处理逻辑,然后使用页面模板来输出显示给用户
以前用户主要就是用浏览器访问,这样的结构没什么问题,但现在移动客户端越来越重要,显然不能使用这个结构,需要为移动客户端开发接口
RESTful API 就可以通过一套统一的接口为所有客户端提供web服务,实现前后端分离
再比如在一个大型系统中,可能是多种开发语言一起工作,使用 RESTful API 就可以完全不关心开发语言,以标准的接口来协同工作
Restfull API是怎么定义的?
下面通过几个示例了解下Restfull API的定义方式
(1)查看所有任务
GET http://test.com/tasks
(2)新建一个任务
POST http://test.com/tasks
Data: title = Foobar
(3)根据ID查看一个任务
GET http://test.com/tasks/123
(4)更新任务
PUT http://test.com/tasks/123
Data: title = New
(5)删除任务
DELETE http://test.com/tasks/123
可以看到Restfull API的风格非常简洁、统一、明确
例如查看操作,用普通方式的话,定义方式是任意的,如:
http://test.com/listall_tasks
‘listall_tasks’ 就是随意定义的,通过这个名字才可以看出是查看全部的意思,如果开发人员用了一个没有明确意义的名字,那就需要看文档或者代码才能知道含义了
而Restfull API 通过 GET 方法就知道是查看操作,通过tasks就知道查看的对象是什么
@Controller
@RequestMapping("/rest")
public class RestController {
//GET http://test.com/tasks 查看
@RequestMapping(value="/tasks/{id}",method=RequestMethod.GET)
public String get(@PathVariable("id") Integer id){
System.out.println("get"+id);
return "/hello";
}
//POST http://test.com/tasks 新增
//Data: user= user
@RequestMapping(value="/tasks ",method= RequestMethod.POST,produces="application/json;charset=UTF-8")
private String add(@RequestBody User user) {
String result = "新增一个名为"+user.getUsername()+",密码为"+user.getPassword()+"的结果";
return result;
//PUT http://test.com/tasks 编辑
//Data: user= user
@RequestMapping(value="/tasks",method= RequestMethod.PUT,produces="application/json;charset=UTF-8")
private String edit(@RequestBody User user) {
String result = "修改一个名为"+user.getUsername()+",密码为"+user.getPassword()+"的结果";
return result;
}
//DELETE http://test.com/tasks/123 删除
@RequestMapping(value="/tasks/{id}",method=RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
System.out.println("delete"+id);
return"/hello";
}
}
博文部分参考:
https://www.jianshu.com/p/b06d28456961
https://blog.csdn.net/qq_34582693/article/details/79981742
推荐阅读