(学习笔记仅帮助自己理解记忆,部分内容可能存在理解错误,如有发现,还望指出)
什么是REST:
- Representational State Transfer(表述性状态转移)
- REST并不是一种创新技术,它指的是一组架构约束条件和原则
- 符合REST的约束条件和原则的架构,就称它为RESTful架构
RESTFul核心内容:
-
资源与UR:资源:图片文字描述等uri对应一个资源
-
资源的表述:请求于响应中对于资源的描述,资源在客户端和服务器之间传送状态转移:客户端发生变迁,进入到后续的状态,客户端获取资源之后可能对资源修改,使他在服务器保存的状态不一样。
-
状态转移:服务器中改变资源的状态,客户端发生变迁,进入到后续的状态,客户端获取资源之后可能对资源修改,使他在服务器保存的状态不一样。
Restful架构特点
-
统一了客户端访问资源的接国
-
url更加简洁,易于理解,便于扩展
-
有利于不同系统之间的资源共享
统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的,
无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次,
结果总是一样的,后面的请求并不会产生比第一次更多的影响
GET
安全且幂等
获取表示
变更时获取表示(缓存)
200(OK) - 表示已在响应中发出
204(无内容) - 资源有空表示
301(Moved Permanently) - 资源的URI已被更新
303(See Other) - 其他(如,负载均衡)
304(not modified)- 资源未更改(缓存)
400 (bad request)- 指代坏请求(如,参数错误)
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
POST
不安全且不幂等
使用服务端管理的(自动产生)的实例号创建资源
创建子资源
部分更新资源
如果没有被修改,则不过更新资源(乐观锁)
200(OK)- 如果现有资源已被更改
201(created)- 如果新资源被创建
202(accepted)- 已接受处理请求但尚未完成(异步处理)
301(Moved Permanently)- 资源的URI被更新
303(See Other)- 其他(如,负载均衡)
400(bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
PUT
不安全但幂等
用客户端管理的实例号创建一个资源
通过替换的方式更新资源
如果未被修改,则更新资源(乐观锁)
200 (OK)- 如果已存在资源被更改
201 (created)- 如果新资源被创建
301(Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他(如,负载均衡)
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
DELETE
不安全但幂等
删除资源
200 (OK)- 资源已被删除
301 (Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他,如负载均衡
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
409 (conflict)- 通用冲突
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
controller层对应注解
@GetMapping
- 处理get请求
- @RequestMapping(value = “/get/{id}”, method=RequestMethod.GET)等同于@GetMapping("/get/{id}")
@PostMapping
- 处理post请求
- @RequestMapping(value = “/get/{id}”,method = RequestMethod.POST)等同于@PostMapping("/get/{id}")
@PutMapping
- 和PostMapping作用等同,都是用来向服务器提交信息;
- 如果是添加信息,倾向于用@PostMapping;
- 如果是更新信息,倾向于用@PutMapping;
@DeleteMapping
- 删除URL映射
@PathVariable
- 指定某形参的值为URL对应的占位
@PatchMapping
- 不知道
RESTful开发风格
传统: http://localhost:8080/show?参数名=参数值
RESTful风格:http://localhost:8080/show/参数值
代码示例:
RESTful风格的编写:
<form action="/edit/${i.cId}" method="post">
<button type="submit" value="编辑"></button>
</form>
@PostMapping(value="/edit/{id}")
public String editCourse(@PathVariable("id")Integer id, Model model){
Course course = cs.selCourseById(id);
model.addAttribute("course",course);
return "updCourse";
}
RESTful架构实现:
<form action="/upd" method="post">
<input type="hidden" name="_method" value="put" />
<....>
</form>
@PutMapping(value = "/upd")
public String updCourse(Course course,Model model){
cs.updCourse(course);
model.addAttribute("courses",cs.getAllCourse());
return "redirect:/rdct";
}
报错情况(405):
Message JSPs only permit GET POST or HEAD
解决:
- 在jsp页面头部声明加上: isErrorPage=“true”
- 将return改为重定向