Java开发中RestFul服务接⼝规范
REST介绍
representational State Transfer (REST) 是⼀种架构原则,其中将 web 服务视为资源,可以由其 URL 唯⼀标识。RESTful Web 服务的关键特点是明确使⽤ HTTP ⽅法来表⽰不同的操作的调⽤。
REST 的基本设计原则对典型 CRUD 操作使⽤ HTTP 协议⽅法:
POST - 创建资源
GET - 检索资源
PUT – 更新资源
DELETE - 删除资源
REST 服务的主要优势在于:
它们是跨平台 (Java、、PHP 等)⾼度可重⽤的,因为它们都依赖基本 HTTP 协议。
它们使⽤基本的 XML,⽽不是复杂的 SOAP XML,使⽤⾮常⽅便。
基于 REST 的 web 服务⽇益成为后端企业服务集成的⾸选⽅法。与基于 SOAP 的 web 服务相⽐,它的编程模型简单,⽽本机 XML(⽽不是 SOAP )的使⽤减少了序列化和反序列化过程的复杂性,并且不再需要其他作⽤相同的第三⽅库。
编写⽬的
编写⽬的
编写本⽂的⽬的是为了规范项⽬系统功能进⾏模块化、服务化,将⽤户的操作以服务的⽅式提供。系统与系统之间遵循服务规范,将系统与系统之间的交互转为定制化服务交互,以实现系统与系统之间的集成。
编写原则
编写原则
可寻址性(Addressability)REST 中的所有东西都基于资源 的概念。资源与 OOP 中的对象或其他名词不同,它是⼀种抽象,必须可以通过 URI 寻址或访问。
接⼝⼀致性(Interface uniformity)与 SOAP 或其他标准不同,REST 要求⽤来操纵资源的⽅法或动
词不是任意的。这意味着 RESTful 服务的开发⼈员只能使⽤ HTTP ⽀持的⽅法,⽐如 GET、PUT、POST、DELETE 等等。因此不需要使⽤ WSDL 等服务描述语⾔。
⽆状态(Statelessness)为了增强可伸缩性,服务器端不存储客户机的状态信息。这使服务器不与特定的客户机相绑定,负载平衡变得简单多了。这还让服务器更容易监视、更可靠。
具象(Representational)客户机总是与资源的某种具象交互,绝不会直接与资源本⾝交互。同⼀资源还可以有多个具象。理论上说,持有资源的具象的任何客户机应该有操纵底层资源的⾜够信息。
连通性(Connectedness)任何基于 REST 的系统都应该预见到客户机需要访问相关的资源,应该在返回的资源具象中包含这些资源。例如,可以以超链接的形式包含特定 RESTful 服务的操作序列中的相关步骤,让客户机可以根据需要访问它们。基于 REST 的 Web 服务⽇益成为后端企业服务集成的
GET,DELETE,PUT和POST的典型⽤法
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)- 接受到的表⽰不受⽀持
DELETE⽤法
500 (internal server error)- 通⽤错误响应
503 (Service Unavailable)- 服务当前⽆法处理请求
不安全但幂等
删除资源
200 (OK)- 资源已被删除
301 (Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他,如负载均衡
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
409 (conflict)- 通⽤冲突
500 (internal server error)- 通⽤错误响应
503 (Service Unavailable)- 服务端当前⽆法处理请求
Java开发中RestFul⽤法举例
//@RestController 代替 @Controller,省略以后的 @ResponseBody
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentservice;
/**
* 显⽰所有
* url:"localhost/student/findall"
*
* @return
*/
@RequestMapping(value = "/findall")
public List<Student> findAllStudent() {
return studentservice.findAllStudent();
}
/**
* 查 restful 风格
* url:"localhost/student/findone/1"
*
* @param id
* @return
*/
// == @RequestMapping(value = "/findone/{id}", method = RequestMethod.GET)
@GetMapping("/findone/{id}")
public Student findStudentRestful(@PathVariable("id") Integer id) {
return studentservice.findStudent(id);
}
/**
* 删除 restful 风格
* url:"localhost/student/deleteone/4"
* 注意⽆法通过浏览器的链接来模拟检验,可以通过 jquery的 $.ajax⽅法,并type="delete" *
* @param id
*/
// == @RequestMapping(value = "/deleteone/{id}", method = RequestMethod.DELETE)
@DeleteMapping("/deleteone/{id}")
public void deleteStudentRestful(@PathVariable("id") Integer id) {
studentservice.deleteStudent(id);
}
/**
* 增加 restful 风格
* url:"localhost/student/addone"
* 通过<form>表单模拟验证
*
* @param student
*/
// == @RequestMapping(value="/addone",method=RequestMethod.POST)
@PostMapping("/addone")
webserver接口开发public void addStudentRestful(Student student) {
studentservice.addStudent(student);
}
/
**
* 修改 restful 风格
* url:"localhost/student/updateone"
* 验证:可以通过 jquery的 $.ajax⽅法,并type="put",同时注意data形式——A=a&B=b&C=c *
* @param student
*/
// == @RequestMapping(value="/addone",method=RequestMethod.PUT)
@PutMapping("/updateone")
public void updateStudentRestful(Student student) {
studentservice.updateStudent(student);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论