目录
一、RESTful初识
二、RESTful设计
三、RESTful服务开发
结合这张图来对RESTful做了解:
一、RESTful初识
REST(【Resource】Representational State Transfer):表现层状态转化
REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful
综合上面的解释,我们总结一下什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过HTTP提供的统一接口,对服务器端资源进行操作,实现"表现层(使用HTTP动词去促使服务器端资源的)状态转化"。
二、RESTful设计
1、资源设计
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。
说明:v1:为版本号。目的:可以方便产品做升级
https://api.example.com/v1/zoos:动物园资源
https://api.example.com/v1/animals:动物资源
https://api.example.com/v1/employees:饲养员资源
2、动作设置
按照HTTP方法的语义来暴露资源 ,有这些动作:
GET(SELECT) : 从服务器取出资源(一项或多项)。
POST(CREATE) : 在服务器新建一个资源。
PUT(UPDATE) : 在服务器更新资源(客户端提供改变后的完整资源)。
DELETE(DELETE): 从服务器删除资源。
3、返回结果
对于上面的动作,我们可以在处理完成的时候,设置相应的相应码标志完成或异常处理
参考该博客:
在HttpServletResponse这个类也有相应的常量对应。如:
public static final int SC_OK = 200;
public static final int SC_CREATED = 201;
public static final int SC_ACCEPTED = 202;
https://api.example.com/v1/employees 对于这个资源路径,按照SpringMVC设计对应
@RequestMapping("v1/employees")
@RestController
public class EmployeeController {
@GetMapping//4.3以后版本
public List<Employee> list(){
//指定GET方法获取资源
}
@PostMapping("{employeeId}/salaries")
public Salary addOneSalary(Salary salary){
//给员工添加一条薪资记录
}
@PutMapping("{id}")
public void update(Employee employee){
//更新一条员工记录。利用ajax发送请求时,要利用httpPutFormContentFilter过滤器处理
要不然发送来的参数会是null
/* 在处理put patch请求时要对设置一个过滤器httpPutFormContentFilter
* HttpPutFormContentFilter过滤器会自动的封装前台传递过来的PUT请求的参数,
* 如果不配置HttpPutFormContentFilter过滤器的话,那么tomcat便不会自主的分封装PUT请求的参
* 数。*/
}
@DeleteMapping("{id}")
public void delById(@PathVariable("id") Long id, HttpServletResponse response){
//删除一条记录
}
}
三、RESTful服务开发
使用SpringMVC开发RESTful服务,就讲解些SpringMVC常用的注解把。
1、@Controller 和 @RestController 及 @ResponseBody
RestController接口继承了Controller接口,并且还注入了ResponseBody注解。因此,在单页面的数据获取中,我们可以直接在这个类中标注RestController注解很方便。
2、@RequestMapping 里面含有restful风格的动作注解
--------@GetMapping
@GetMapping 等价于 @RequestMapping(value = "employees",method = RequestMethod.GET)其他也类似。
--------@PatchMapping
Patch方式是对put方式的一种补充; put方式是可以更新.但是更新的是整体.patch是对局部更新;
注:SpringMVC在对于ajax发送的 put、patch请求时要对设置一个过滤器httpPutFormContentFilter,上面有提及。
<!-- HttpPutFormContentFilter过滤器对 put patch请求参数进行处理-->
<filter>
<filter-name>httpPutFormContentFilter</filter-name>
<!-- 我们写的过滤的地址 -->
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpPutFormContentFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
---------@PutMapping、@PostMapping
我们常用的请求是post跟get,而REST风格的URL还有put跟delete请求,这四种请求对应的是数据库的CURD。 通常的浏览器都只是支持post跟get,这时候就需要HiddenHttpMethodFilter 过滤器来将post请求转换为put跟delete请求。
利用from表单的形式发送put请求
对于表单而言 method只有post、get因此我们要做一下处理设置隐藏提交方式提交put请求
<form action="/employees/1" method="post">
<input type="hidden" name="_method" value="put">
<input name="name" type="text"/><!-- 隐藏提交方式,实际上提交的是put -->
<button>提交</button>
</form>
HiddenHttpMethodFilter过滤器来将post请求转换为put跟delete请求。 _method 拦截器定义的属性:private String methodParam = "_method";
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<!-- 我们写的过滤的地址 -->
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
3、@RequestMapping的参数化
详情参见:
4、@PathVariable
映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable("xxx") 绑定到操作方法的入参中 。如:
/*
* @JsonFormat(pattern = "yyyy-mm-dd",timezone = "GEM+8") :后台返回给前台时间的注解
*/
@GetMapping("{employeeId}/salaries/{month}")
public Salary getSalary(@PathVariable Long employeeId,@PathVariable
@DateTimeFormat(pattern = "yyyy-mm-dd") Date month){
return new Salary(1l,employeeId, BigDecimal.TEN,month);
}