先了解一下API和前后端分离
什么是API(应用程序编程接口)
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科
说人话就是
研发人员A开发了软件A,研发人员B正在研发软件B。
有一天,研发人员B想要调用软件A的部分功能来用,但是他又不想从头看一遍软件A的源码和功能实现过程,怎么办呢?
研发人员A想了一个好主意:我把软件A里你需要的功能打包好;你把这个包放在软件B里,就能直接用我的方法了!其中,API就是研发人员A说的那个方法。
应用接口: 很多情况下,需要把系统的功能作为服务暴露给外部的其他应用使用,就需要把系统中的服务作为API接口暴露出去,一般分为公共接口(发短信,天气服务)和私用接口(公司内部使用的);
传统的开发模式与前后端分离模式对比
传统的开发模式
- 前端工程师负责编写HTML页面,完成前端页面设计;
- 后端工程师使用模板技术将HTML页面代码转换为JSP页面,同时内嵌后端代码(如Java);
前后端强依赖,后端必须要等前端的HTML开发好才能转换成JSP,如果需求变更,前端HTML要改,后端JSP也要跟着变,使得开发效率降低。 - 产品交付时,要将前后端代码全部进行打包,部署到同一服务器上,或者进行简单的动静态分离部署。
问题:前后端严重耦合
- 前端需要改bug调试时,需要在当前电脑安装一整套后端的开发工具,启动后端程序。
- 还要求后端人员会html,js等前端语言。
- 前端页面也会嵌入很多后端的代码
- 一旦后端换了一套语言,前端也需要重新开发
- 沟通成本,调试成本,前后端开发进度相互影响,从而大大降低开发效率
前后端分离
- 前后端约定好API接口&数据&参数;
- 前后端并行开发;
前端工程师只需要编写HTML页面,通过HTTP请求调用后端提供的接口服务即可;
后端只需要开发接口即可。
无强依赖,如果需求变更,只要接口和参数不变,就不用两边都修改代码,开发效率高。 - 除了开发阶段分离、在运行期前后端资源也会进行分离部署。
优点:
- 前后端责任清晰,后端专注于数据上,前端专注于视觉上。
- 无需等待对方的开发工作结束,提高开发效率。
- 可应对复杂多变的前端需求。
- 增强代码可维护性
RESTful
什么是Restful:
对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构).
符合REST约束风格和原则的应用程序或设计就是RESTful.
RESTful风格
REST是一种设计API的模式(风格)。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,使用JSON格式的REST风格的API具有简单、易读、易用的特点。满足这些约束条件和原则的应用程序或设计就是 RESTful 应用。
RESTful设计
网络上的所有事物都被抽象为资源
每个资源都有一个唯一的资源标识符
同一个资源具有多种表现形式(xml,json等)
对资源的各种操作不会改变资源标识符
所有的操作都是无状态的
符合REST原则的架构方式即可称为RESTful
RESTful对资源操作-使用统一接口
REST要求,必须通过统一的接口来对资源执行各种操作。
HTTP1.1协议为例:
7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
请求方式 | 作用 |
---|---|
GET(SELECT) | 从服务器取出资源(一项或多项) |
POST(CREATE) | 在服务器新建一个资源 |
PUT(UPDATE) | 在服务器更新资源(客户端提供改变后的完整资源)。PUT更新整个对象 |
PATCH(UPDATE) | 在服务器更新资源(客户端提供改变的属性【补丁】)。 PATCH更新个别属性 |
DELETE(DELETE) | 从服务器删除资源。 |
未使用RESTful风格 VS RESTful风格 编码
未使用
@Controller
@RequestMapping("employee")
public class EmployeeController {
@RequestMapping("get")
@ResponseBody
public Object getById(Long id){
Employee employee = new Employee();
employee.setId(id);
employee.setName("xiaoyun");
employee.setAge(18);
return employee;
}
}
请求路径:http://localchost:8080/employee/get?id=1
使用
@RestController
@RequestMapping("employees")
public class EmployeeController2 {
@GetMapping("get/{id}")
public Object getById(@PathVariable Long id){
Employee employee = new Employee();
employee.setId(id);
employee.setName("xiaoyun");
employee.setAge(18);
return employee;
}
}
请求路径:http://localchost:8080/employees/get/1
RESTful相关注解
@RestController
由 @Controller + @ResponseBody组成
@PathVariable
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
参考栗子:
//------方式一--------
@RequestMapping(value = "/employees/{id}",method = RequestMethod.GET)
@ResponseBody
public Object getById(@PathVariable Long id){
Employee employee = new Employee();
employee.setId(id);
employee.setName("xiaoyun");
employee.setAge(6);
return employee;
}
//------方式二--------
@RestController
@RequestMapping("employees")
public class EmployeeController2 {
@GetMapping("get/{id}")
public Object getById(@PathVariable Long id){
Employee employee = new Employee();
employee.setId(id);
employee.setName("xiaoyun");
employee.setAge(18);
return employee;
}
}
@RequestMapping
属性:
1.value/path:映射路径;
2.method:限定请求的方式,枚举:
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
3.params:限定要处理请求的参数,只有匹配该参数的请求,才会被该方法处理;
@GetMapping(value = "list",params="version=1")
public Object list() {
return "ok";
}
4.headers:限定要处理请求的请求头信息,只有匹配该请求头内容的请求,才会被该方法处理;
@GetMapping(value = “/test”, headers = “content-type=text/*”)
@GetMapping
用于在服务器查询出资源,等价于@RequestMapping(value = "/employees",method = RequestMethod.GET)
@PostMapping
用于在服务器新建一个资源等价于 @RequestMapping(value = "/employees",method = RequestMethod.POST)
@PutMapping
用于在服务器更新资源,更新整个对象 @RequestMapping(value = "/employees",method = RequestMethod.PUT)
@DeleteMapping
用于从服务器删除资源,等价于 @RequestMapping(value = "/employees/{id}",method = RequestMethod.DELETE)