浅谈Restful风格下的请求接口设计
- 应用接口的概念
把系统中的服务作为API接口暴露给外部链接使用 - 传统开发模式与前后端分离开发模式
- restful风格接口设计
怎样确定资源,进而确定路径
怎样确定请求方式
确定请求参数
确定返回值 - 页面js怎么发起异步请求访问restful风格接口
- 常用的restful接口相关标签
- requestMapping标签的属性
Springboot的自动配置原理
- SpringBoot启动的时候加载主配置类, 开启了自动配置功能 @EnableAutoConfigration
- @EnableAutoConfigration 作用:
利用EnableAutoConfigrationImportmentSelector 选择器 给容器导入一些组件?
可以插入selectorImports()方法的内容 :
List configurations = getCandidateConfigurations(候选的)(annotationMetadata(注解数据), attributes(属性)); 获取候选的配置 :
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());
扫描所有jar包类路径下 , META-INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取EnableAutoConfigration.classe类(类名)对应的值,然后把它们添加在容器中
将类路径下META-INF/spring.factories 里面配置的所有EnableAutoConfigration的值加入到容器中
- 每一个这样的xxxAutoConfigration 类都是容器中的一个组件,都加入到容器中,用他们来做自动配置
- 每一个自动配置类进行自动配置功能
- 以其中一个为例解释其自动配置原理
@EnableAutoConfiguation,@Conditional,@EnableConfigProperties,@ConfigurationProperties等注解实现的。
具体流程如下:当我们写好一个启动类后,我们会在启动类上加一个@SpringBootApplication,我们可以点开这个注解可以看到它内部有一个@EnableAutoConfiguation的注解,
我们继续进入这个注解可以看到一个@Import的注解,这个注解引入了一个AutoConfigurationImportSelector的类。
我们继续打开这个类可以看到它有一个selectorImport的方法,这个方法又调用了一个getCandidateConfigurations方法,
这个方法内部通过SpringFactoriesLoader.loadFactoryNames最终调用loadSpringFactories加载到一个META-INF下的spring.factories文件。
打开这个文件可以看到是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔。
当我们通过springApplication.run启动的时候内部就会执行selectImports方法从而找到配置类对应的class。然后将所有自动配置类加载到Spring容器中,进而实现自动配置。
API接口
- jar包形式 : 将功能打包成一个jar , 需要功能项目直接依赖引入jar即可使用该功能
- http形式 : 需要相关功能项目发一个http请求,就可以实现功能调用(例如 输入快递单号)
应用接口 : 使用Http形式Api接口获取功能
Web技术的发展阶段
- 静态内容阶段
- CGI程序阶段 : 出现了一些动态变化内容
- 脚本语言阶段: ASP PHP JSP
- 瘦客户端阶段 : easyui
- RIA应用阶段 (富客户端)
- 移动Web应用阶段 : Android IOS Windows Phone —> HTML5
开发模式
传统开发模式 与分离模式开发区别
RESTful风格
设计API模式
JSON , 最常用
JSON 可直接被 JavaScript读取
使用JSON格式的REST风格的API具有 简单、易读、易用的特点
设计映射方法(接口)考虑的问题:
- 接口的映射路径
明确指定要操作的资源(操作对象) 使用负数 加s - 请求方式(get/post)
restful风格中,使用请求方法来描述状态数据变化
get : 查询 post : 添加 put : 更新 PATCH(UPDATE) delete: 删除 - 请求的参数
跟之前操作一样 , 根据需求看需求 - 返回值
根据需求决定 返回的格式是JSON格式
RESTful设计
- 网络上所有的事物都被抽象为资源
个资源都有一个唯一的资源定位符(URI)。每个URI代表一种资源(resource) - 资源状态转换
restful要求 , 必须通过统一的接口来对资源执行各种操作服务器,需使用Http方法去促使服务器端发生状态改变 - 使用统一接口
GET(SELECT):查询 分为单查 和 多查 (value=’/{id}’)
PUT(UPDATE):更新
PATCH(UPDATE):PATCH更新个别属性
DELETE(DELETE):删除
HEAD:获得一个资源的元数据,比如一个资源的hash值或者最后修改日期;
OPTIONS:获得客户端针对一个资源能够实施的操作;(获取该资源的api(能够对资源做什么操作的描述))
HTTP响应状态码
200 服务器成功返回用户请求的数据
400 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 表示用户没有权限(令牌、用户名、密码错误)
404
500 服务器发生错误,用户将无法判断发出的请求是否成功。
Accept 与 context -Type 区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5q1NJV4O-1596698393328)(C:\Users\白米白9999\AppData\Roaming\Typora\typora-user-images\1595994036225.png)]
accept : application/json 代表客户端希望被接受的数据类型 , 只能是发送请求的时候带的
Context-Type : application/json 表客户端/服务器携带的数据类型
传统方式
优点 : 开发简单 , 各种类型参数都可以传递
缺点 : 参数容易保留 不安全
参数路径方式
优点 : 参数被隐藏 ,相对安全
缺点 : 开发麻烦 , 参数不能带中文 ,参数个数有限
页面js怎么发起异步请求访问restful风格接口
- 通过jquery 中的ajax相关的方法 get/post 方法外
- 调用原生态的ajax方法 $.ajax({
url : 请求路径
type : 请求类型
data: 请求参数
success : 返回结果
})
注意查询所有与查询单个(需要将参数拼接到请求路径上)
查询所有 $('#btn4').click(function () {
$.get('/employees',function (data) {
console.log(data);
})
});
查询单个 $('#btn5').click(function () {
$.ajax({
url:"/employees/1",
type:"get",
success:function (data) {
console.log(data);
}
})
相关注解
@RestController = @Controller + @ResponseBody
@PathVariable
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-076uni9V-1596698393330)(C:\Users\白米白9999\AppData\Roaming\Typora\typora-user-images\1596008064286.png)]
**@RequestMapping ** 配置路径
@RestController
@RequestMapping("/employees")
public class RtfController {
**@GetMapping **
@GetMapping
public Object list(){
return Arrays.asList(new Employee(1L,"xiaosun",18)
,new Employee(2L,"xiaobai",18));
}
@GetMapping(value = "/{id}")
public Object selectOne(@PathVariable Long id){
return new Employee(id,"懒洋洋",18);
}
**@PostMapping **
@PostMapping
public Object insert(Employee employee){
return employee;
}
**@PutMapping **
@PutMapping
public Employee update(Employee employee){
return new Employee(employee.getId(),employee.getName()+"_update",18);
}
**@DeleteMapping **
@DeleteMapping
public JsonResult delete(){
return new JsonResult();
}
RequestMapping标签的属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TaIzAfLQ-1596698393330)(C:\Users\白米白9999\AppData\Roaming\Typora\typora-user-images\1596034633278.png)]
value/path:映射路径;
method:限定请求方法:
params:需配置响应的参数才能调用
n new Employee(employee.getId(),employee.getName()+"_update",18);
}
**@DeleteMapping **
```java
@DeleteMapping
public JsonResult delete(){
return new JsonResult();
}
RequestMapping标签的属性
[外链图片转存中…(img-TaIzAfLQ-1596698393330)]
value/path:映射路径;
method:限定请求方法:
params:需配置响应的参数才能调用
headers:限定要处理请求的请求头信息,