RESTful风格

先了解一下API和前后端分离

什么是API(应用程序编程接口)

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科

说人话就是

研发人员A开发了软件A,研发人员B正在研发软件B。

有一天,研发人员B想要调用软件A的部分功能来用,但是他又不想从头看一遍软件A的源码和功能实现过程,怎么办呢?

研发人员A想了一个好主意:我把软件A里你需要的功能打包好;你把这个包放在软件B里,就能直接用我的方法了!其中,API就是研发人员A说的那个方法。

应用接口: 很多情况下,需要把系统的功能作为服务暴露给外部的其他应用使用,就需要把系统中的服务作为API接口暴露出去,一般分为公共接口(发短信,天气服务)和私用接口(公司内部使用的);

传统的开发模式与前后端分离模式对比

传统的开发模式

  1. 前端工程师负责编写HTML页面,完成前端页面设计;
  2. 后端工程师使用模板技术将HTML页面代码转换为JSP页面,同时内嵌后端代码(如Java);
    前后端强依赖,后端必须要等前端的HTML开发好才能转换成JSP,如果需求变更,前端HTML要改,后端JSP也要跟着变,使得开发效率降低。
  3. 产品交付时,要将前后端代码全部进行打包,部署到同一服务器上,或者进行简单的动静态分离部署。

问题:前后端严重耦合

  1. 前端需要改bug调试时,需要在当前电脑安装一整套后端的开发工具,启动后端程序。
  2. 还要求后端人员会html,js等前端语言。
  3. 前端页面也会嵌入很多后端的代码
  4. 一旦后端换了一套语言,前端也需要重新开发
  5. 沟通成本,调试成本,前后端开发进度相互影响,从而大大降低开发效率

前后端分离

  1. 前后端约定好API接口&数据&参数;
  2. 前后端并行开发;
    前端工程师只需要编写HTML页面,通过HTTP请求调用后端提供的接口服务即可;
    后端只需要开发接口即可。
    无强依赖,如果需求变更,只要接口和参数不变,就不用两边都修改代码,开发效率高。
  3. 除了开发阶段分离、在运行期前后端资源也会进行分离部署。

优点:

  1. 前后端责任清晰,后端专注于数据上,前端专注于视觉上。
  2. 无需等待对方的开发工作结束,提高开发效率。
  3. 可应对复杂多变的前端需求。
  4. 增强代码可维护性

img

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云很优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值