什么是RESTful风格
REST是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,使用JSON格式的REST风格的API具有简单、易读、易用的特点。满足这些约束条件和原则的应用程序或设计就是 RESTful 应用。
为什么使用这套风格
虽然客户端有很多种类,但只要服务端统一提供API接口,多个客户端局域相同的协议哟用来调用该API即可获取数据。
不同的开发者对API接口的设计习惯不同,就会出同一个功能不同的API,如下:
新增员工:
http://localhost/employee/save
http://localhost/employee/add
http://localhost/employee/new
http://localhost/employee/xinzeng
http://localhost/employee/append
http://localhost/employee?cmd=add
所以,RESTful风格的API诞生了。
RESTful设计
1.网络上的所有事物都被抽象为资源
每个资源都有一个唯一的资源定位符(URI)。每个URI代表一种资源(resource),所以URI中不能有动词,只能有名词,而且所用的名词往往与数据库的表名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以URI中的名词也应该使用复数。如下:
https://api.example.com/depts :部门资源
https://api.example.com/employees :员工资源
https://api.example.com/zoos :动物园资源
https://api.example.com/animals : 动物资源
2.资源状态转换
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到资源和资源状态变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有资源的状态都保存在服务器端。因此,如果客户端想要操作服务器,须使用HTTP方法去促使服务器端资源发生状态改变。
改变(服务器端)资源的状态
http://www.wolfcode.cn/employees
新增:员工资源 从无到有 状态的变化
更新:员工资源 从某个状态变成另外一种状态的转换
删除:员工资源 从有到无 状态的变化
3.使用统一接口
REST要求,必须通过统一的接口来对资源执行各种操作。
HTTP1.1协议为例: 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。PUT更新整个对象
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性【补丁】)。 PATCH更新个别属性
DELETE(DELETE):从服务器删除资源。
//了解
HEAD:获得一个资源的元数据,比如一个资源的hash值或者最后修改日期;
OPTIONS:获得客户端针对一个资源能够实施的操作;(获取该资源的api(能够对资源做什么操作的描述))
例子
对员工表的增删查改
@Controller
public class EmployeeController{
/**
* RESTful风格接口设计
*
* 1.请求路径,在操作类型对象名后加s 作为访问路径资源 如 对员工对象进行操作https://localhost:8080/employees
* 2.请求方法 GET查,POST存,DELETE删,PUT改
* 3.请求参数
* 4.请求响应 建议响应JSON格式数据
*/
/**
* 查询员工
* 请求路径 /employees
* 请求方式 查 GET
* 请求参数 无
* 请求响应 JSON
* @return
*/
@RequestMapping(value = "/employees",method = RequestMethod.GET)
@ResponseBody
public Employee select(){
return new Employee(1L,"人间一两风",23);
}
/**
* 新增员工对象
* 请求路径 /employees
* 请求方式 存 POST
* 请求参数 id,name,age
* 请求响应 Employee对象 JSON
*/
@RequestMapping(value = "/employees",method = RequestMethod.POST)
@ResponseBody
public Employee save(Long id, String name,Integer age){
return new Employee(id,name,age);
}
/**
* 更新员工信息
* 请求路径 /employees
* 请求方式 更新 PUT
* 请求参数 Employee
* 请求响应 Employee对象 JSON
*/
@RequestMapping(value = "/employees",method = RequestMethod.PUT)
@ResponseBody
public Employee save(Employee employee){
return new Employee(employee.getId(), employee.getName(), employee.getAge());
}
/**
* 根据id删除员工对象
* 请求路径 /employees
* 请求方式 删 DELETE
* 请求参数 id
* 请求响应 结果对象(code,msg,data) JSON
*/
@RequestMapping(value = "/employees",method = RequestMethod.DELETE)
@ResponseBody
public AjaxJson delete(Long id){
//return AjaxJson.success(id);
return AjaxJson.error(" "+id);
}
}
使用参数路径的方式进行操作
URL组成 : 协议://IP地址:端口/路径?参数1=值1&参数2=值2... 传统带参访问方式: 接口:/employees 访问路径 http://localhost:8080/employee?id=1&name=人间一两风&age=23
使用参数路径访问方式: 接口:/employees/{id}/{name}/{age} http://localhost:8080/employee/1/rjylf/23
也可以很合使用 : 接口:/employees/{id}
http://localhost:8080/employee/1?name=人间一两风&age=23 只有id作为路径参数,所以只需要对id进行@PathVariable 注解即可
@Controller
public class EmployeeController{
// 传统访问路径 http://localhost:8080/employees?id=1&name=rjylf&age=23
@RequestMapping(value = "/employees",method = RequestMethod.PUT)
@ResponseBody
public Employee update(Long id, String name,Integer age){
return new Employee(id,name,age);
}
// 参数路径访问 http://localhost:8080/employees/1/rjylf/23
@RequestMapping(value = "/employees/{id}/{name}/{age}",method = RequestMethod.PUT)
@ResponseBody
public Employee update(Long id, String name,Integer age){
return new Employee(id,name,age);
}
// 混合使用 http://localhost:8080/employees/1?name=rjylf&age=23
@RequestMapping(value = "/employees/{id}",method = RequestMethod.PUT)
@ResponseBody
public Employee update(@PathVariable() Long id, String name,Integer age){
return new Employee(id,name,age);
}
}