我最近的在做的项目是一个前后端分离的项目,前后端由不同的团队分别开发,并且前端的进度经常领先后端。这就意味着,当前端在开发一个新功能时,API 可能还没有准备好。不过,我们会先和后端先商议好 API Schema,然后使用 Mock 数据进行开发。

但问题也随之而来,定义 Mock 数据并配置 mock server 真的太浪费时间了!我真的非常讨厌这种没有任何技术含量的「苦力活」。所以,只好想办法让生成 Mock 数据的过程「自动化」。那么,从哪里生成这些 Mock 数据呢?突然想到了开发时使用的 Swagger UI,它提供的 Swagger JSON 准确地定义了所有的 API Schema。因此,我们可以通过 Swagger JSON 去自动生成 Mock 数据。

本篇文章会介绍如何通过 Swagger 定义去生成 Mock 数据以及 Mock Server 的配置。主要内容包括:

Swagger 简介

通过 Swagger JSON 生成 Mock 数据

处理 Swagger JSON

生成 Mock 数据

生成 Mock Server 配置

本文所有代码都在这个仓库 swagger-faker。

Swagger 简介

在介绍 Swagger 之前,你需要先了解一下 OpenAPI 规范。因为 Swagger 定义是基于 OpenAPI 规范的。

OpenAPI 规范(OAS)为 RESTful API 定义了一个与语言无关的标准接口,允许人和计算机发现和理解服务的功能,而无需通过访问源代码、文档或开发者工具。

OpenAPI 定义大致如下:

{

"swagger": "2.0",

"info": {},

"host": "petstore.swagger.io",

"basePath": "/v2",

"tags": [],

"schemes": [],

"paths": {

"/user/logout": {

"get": {

"tags": [

"user"

],

"summary": "Logs out current logged in user session",

"description": "",

"operationId": "logoutUser",

"produces": [

"application/xml",

"application/json"

],

"parameters": [

],

"responses": {

"default": {

"description": "successful operation"

}

}

}

}

},

"securityDefinitions": {},

"definitions": {},

"externalDocs": {}

}

通过上面的示例,我们可以清楚地知道,/user/logout 用于注销当前已登录的用户会话。它是一个 GET 请求,且不接收任何请求参数。当然,清楚地描述一个 API 意味着要定义很多东西。你可能会觉得 OpenAPI 定义写起来有点麻烦?不用担心,在实际工作中,我们会通过注解的方式自动生成 OpenAPI 定义。

基于 OpenAPI 定义,我们还可以完成很多事情。比如自动生成服务器和客户端代码(Swagger Codegen)、通过交互式的 UI 来可视化服务接口(Swagger UI)等等。

通过 Swagger JSON 生成 Mock 数据

处理 Swagger JSON

要生成 Mock 数据,我们应该从 Swagger JSON 中获取哪些内容?我从 这个 Swagger JSON 中截取了一段数据,如下所示。仔细观察下面的内容并思考这个问题。

{

"paths": {

"/pet/findByStatus": {

"get": {

"tags": ["pet"],

"summary": "Finds Pets by status",

"description": "Multiple status values can be provided with comma separated strings",

"operationId": "findPetsByStatus",

"produces": ["application/xml", "application/json"],

"parameters": [

{

"name": "status",

"in": "query",

"description": "Status values that need to be considered for filter",

"required": true,

"type": "array",

"items": {

"type": "string",

"enum": ["available", "pending", "sold"],

"default": "available"

},

"collectionFormat": "multi"

}

],

"responses": {

"200": {

"description": "successful operation",

"schema": {

"type": "array",

"items": {

"$ref": "#/definitions/Pet"

}

}

},

"400": {

"description": "Invalid status value"

}

},

"security": [

{

"petstore_auth": ["write:pets", "read:pets"]

}

]

}

}

}

}

从上面的例子中可以发现,对于一个请求来说,我们需要的 Mock 数据就是它成功响应之后的数据。也就是说,对于 Swagger JSON,我们需要关心 responses 中 HTTP Status Code 为 2xx 的数据。但是 response 可能会引用 definitions 中定义的数据。因此,为了生成 Mock 数据,我们还需要处理 $ref,也就是用 Definitions 中定义的数据替换它。

生成 Mock 数据

处理好 response 之后,就可以生成 Mock 数据了。因为 Swagger JSON 中可以为 response 或者每一个 property 定义 examples/example,所以使用 examples/example 来生成 Mock 数据一定是最准确的。因此,我们会优先使用 examples/example。如果没有定义 examples/example,我们就通过 type 定义的数据类型去生成。

因为 faker.js 能让我们更方便地去生成 Mock 数据,因此这里选用了它。你可以像下面这样,构造一些方法,去生成不同类型的假数据。

import * as faker from "faker";

export const getRandomArrayItem = (items: any[]) => items[Math.floor(Math.random() * items.length)];

export const booleanGenerator = () => faker.random.boolean();

export const stringGenerator = (enumList?: any[]) => (enumList ? getRandomArrayItem(enumList) : faker.random.words());

export const numberGenerator = (max?: number, min?: number) =>

faker.random.number({

min,

max,

});

export const fileGenerator = () => faker.system.mimeType();

生成 Mock Server 配置

除了生成 Mock 数据之外,很多时候我们还需要配置 Mock Server。就拿我们常用的 JSON Server 来说,我们还需要配置一些额外的东西。比如在 db.json 中配置路由对应的 Mock 数据,在 routes.json 中自定义路由规则等。

因此,我们还需要从 response 中获取更多的内容,包括 path、basePath、method、response 和 queryParams,如下所示:

{

"path": "/pet/findByStatus",

"basePath": "/v2",

"method": "get",

"response": [

{

"id": 93645,

"category": {

"id": 85609,

"name": "open-source"

},

"name": "doggie",

"photoUrls": ["firewall Berkshire withdrawal"],

"tags": [

{

"id": 13201,

"name": "Salad synthesize e-business"

}

],

"status": "pending"

}

],

"queryParams": ["status"]

}

生成 JSON Server 中的自定义路由时,我们可以根据规则,使用 basePath, path 和 queryParams 拼接即可。

// routes.json

{

"/v2/pet/findByStatus?status=:status": "./findPetsByStatus"

}

最后,将这些数据写入对应的文件中便大功告成了。

最后

生成 Mock 数据的过程中还是有很多细节需要处理,感兴趣的同学可以去这个仓库 swagger-faker 查看源码。

swagger mock文档服务器,通过 Swagger 定义自动生成 Mock 数据相关推荐

  1. WPS文档如何设置或取消自动生成序号

    WPS文档如何设置或取消自动生成序号 文件  - 选项 - 编辑 - 取消勾选"自动编号"栏目下的"键入时自动应用自动编号列表",点击右下角的"确定& ...

  2. swagger api文档_带有Swagger的Spring Rest API –创建文档

    swagger api文档 使REST API易于使用的真正关键是好的文档. 但是,即使您的文档做得很好,您也需要设置公司流程的权利以正确,及时地发布它. 确保利益相关者按时收到是一回事,但是您也要负 ...

  3. swagger api文档_带有Swagger的Spring Rest API –公开文档

    swagger api文档 创建API文档后,将其提供给涉众很重要. 在理想情况下,此发布的文档将足够灵活以解决任何最后的更改,并且易于分发(就成本以及完成此操作所需的时间而言). 为了使之成为可能, ...

  4. word文档添加多级目录,自动生成目录

    word文档添加多级目录 转载:http://jingyan.baidu.com/article/8ebacdf0c32c5f49f65cd53f.html Word如何添加一级二级标题等多级标题 有 ...

  5. swagger接口文档使用

    swagger接口文档 一,swagger简介 前后端分离 swagger 诞生 二,springboot集成swagger 依赖 编写helloworld接口 配置swagger ==> co ...

  6. phpexcel 导出循环增加列数_基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)...

    前言 在上一篇导出文档番外篇中,我们已经熟悉了怎样根据json数据导出word的文档,生成接口文档,而在这一篇,将对上一篇进行完善补充,增加多种导出方式,实现更加完善的导出功能. 回顾 1. 获取Sw ...

  7. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

    前言 回顾之前的两篇Swagger做Api接口文档,我们大体上学会了如何在net core3.1的项目基础上,搭建一套自动生产API接口说明文档的框架. 本来在Swagger的基础上,前后端开发人员在 ...

  8. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

    前言 在上一篇导出文档番外篇中,我们已经熟悉了怎样根据json数据导出word的文档,生成接口文档,而在这一篇,将对上一篇进行完善补充,增加多种导出方式,实现更加完善的导出功能. 回顾 1. 获取Sw ...

  9. API接口文档利器:Swagger

    文章目录 API接口文档利器:Swagger Swagger介绍 Swagger常用注解 Swagger测试 Swagger生成API文档的工作原理: API接口文档利器:Swagger Swagge ...

最新文章

  1. 有了这 4 款工具,老板再也不怕我写烂SQL了
  2. 可汗学院向量入门 矩阵入门
  3. 光流 | 基于Horn-Schunck HS变分光流算法改进
  4. Python练习 | Python中的strip()函数使用???(求解决方法)
  5. python中title用法_在CSV fi中使用Title()
  6. Scala在挖财的应用实践
  7. Ubuntu16.04安装docker
  8. 热血致敬!曾影响几代科学巨匠的传奇经典,至今仍无人能超越!
  9. MTK 驱动---(10) emmc总线
  10. Python文件管理模块封装,提供大家直接调用(最全最好用)
  11. waitpid最后以一个参数设为0_变频器用远传压力表控制恒压供水参数设置
  12. ansys软件linux安装教程,ansys 15 for linux 安装纪录
  13. matlab伏安特性曲线的图,电源伏安特性曲线的意义详细解析
  14. Web小应用---网页聊天室
  15. Java代码 打印等腰三角形、菱形和平行四边形
  16. load_weights` requires h5py when loading weights from HDF5
  17. 虚拟现实制陶制作方法对中学生创造力和学习参与度的影响
  18. 旧金山犯罪预测与可视化分析
  19. Stream中map和flatmap的区别,一看就懂
  20. Gson JsonParser

热门文章

  1. Ubuntu 安装lua
  2. 整人病毒vbs大全!
  3. java mkdir和mkdirs的区别
  4. 并发类编程—ReentrantLock(可重入锁)
  5. 奈奎斯特采样定理-为什么采样率需要时被测信号最高频率的两倍
  6. java mail header_[JavaMail]9 详解Multipart和BodyPart
  7. 超市使用计算机的方法,支付宝超市红包怎么用 实体超市便利店红包使用方法...
  8. springboot项目报错:ERROR 9112 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] 的解决办法
  9. 摄像机标定中四大坐标系之间的关系
  10. Java super关键字(超详细!)