浅谈Restful风格下的请求接口设计

  1. 应用接口的概念
    把系统中的服务作为API接口暴露给外部链接使用
  2. 传统开发模式与前后端分离开发模式
  3. restful风格接口设计
    怎样确定资源,进而确定路径
    怎样确定请求方式
    确定请求参数
    确定返回值
  4. 页面js怎么发起异步请求访问restful风格接口
  5. 常用的restful接口相关标签
  6. requestMapping标签的属性

Springboot的自动配置原理

  1. SpringBoot启动的时候加载主配置类, 开启了自动配置功能 @EnableAutoConfigration
  2. @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的值加入到容器中

  1. 每一个这样的xxxAutoConfigration 类都是容器中的一个组件,都加入到容器中,用他们来做自动配置
  2. 每一个自动配置类进行自动配置功能
  3. 以其中一个为例解释其自动配置原理

@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接口

  1. jar包形式 : 将功能打包成一个jar , 需要功能项目直接依赖引入jar即可使用该功能
  2. http形式 : 需要相关功能项目发一个http请求,就可以实现功能调用(例如 输入快递单号)

应用接口 : 使用Http形式Api接口获取功能


Web技术的发展阶段

  1. 静态内容阶段
  2. CGI程序阶段 : 出现了一些动态变化内容
  3. 脚本语言阶段: ASP PHP JSP
  4. 瘦客户端阶段 : easyui
  5. RIA应用阶段 (富客户端)
  6. 移动Web应用阶段 : Android IOS Windows Phone —> HTML5

开发模式

传统开发模式 与分离模式开发区别

rest接口入参能是string吗_spring


RESTful风格

设计API模式

JSON , 最常用

JSON 可直接被 JavaScript读取

使用JSON格式的REST风格的API具有 简单、易读、易用的特点

设计映射方法(接口)考虑的问题:

  1. 接口的映射路径
    明确指定要操作的资源(操作对象) 使用负数 加s
  2. 请求方式(get/post)
    restful风格中,使用请求方法来描述状态数据变化
    get : 查询 post : 添加 put : 更新 PATCH(UPDATE) delete: 删除
  3. 请求的参数
    跟之前操作一样 , 根据需求看需求
  4. 返回值

根据需求决定 返回的格式是JSON格式

RESTful设计

  1. 网络上所有的事物都被抽象为资源
    个资源都有一个唯一的资源定位符(URI)。每个URI代表一种资源(resource)
  2. 资源状态转换
    restful要求 , 必须通过统一的接口来对资源执行各种操作服务器,需使用Http方法去促使服务器端发生状态改变
  3. 使用统一接口
    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风格接口

  1. 通过jquery 中的ajax相关的方法 get/post 方法外
  2. 调用原生态的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:限定要处理请求的请求头信息,