欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Restfull API 介绍 + 示例

程序员文章站 2022-03-08 16:45:57
...

什么是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

相关标签: Restfull