1.2 如何获取Swagger的内容
上一个小节,我们学习到了什么是Swagger,使用它带来的好处有哪些。如果Swagger只提供了上一节说到的功能,那我们就不会特殊来讲它了。实际上Swagger起初就是一套标准,一套编写接口API文档的规范。既然是规范,就一定有固定的格式,既然有固定的格式,就可以解析它。有的同学可能要问,你为什么非要去解析它呢?在线调式的页面都有了,你还想要什么?我想要接口文档变更后,接口测试相关用例、脚本自动同步更新。
咱们还是一步步来,先不谈接口用例、脚本如何同步更新。说说如何自动化的获取到Swagger文档中的数据。如果Swagger能给我提供一个接口,我去调用它,就可以获取到文档中的所有数据。这些数据原本是展示在前端调式页面的信息,我现在可以直接获取它,那就太方便了。Swagger做到了我们想要的。
调用Swagger数据接口
我们在上一个小节,在8080端口部署了一个服务。我们还是访问8080端口,只是稍稍修改一下后面的路径,增加:/v2/api-docs
``` http://49.232.147.132:8080/v2/api-docs ```
所有的数据全部以一个庞大的Json返回。下一步我们尝试使用Python的Requests类型调用这个接口。这么大的数据量还是需要脚本来做进一步处理。==关于如何使用Python对接口进行自动化测试,请参考我的《接口测试最佳实践》的第三章==
``` import requests res = requests.get("http://49.232.147.132:8080/v2/api-docs") print(res.text) ```
到这一步结束,我们已经使用Python拿到了所有Swagger数据--Json字符串格式。
弄清楚Swagger的Json返回数据格式
有了数据,就要动手开始解析了。在解析之前要先弄清楚,这个庞大的Json内部的格式。网上有很多Json文档在线解析工具,作用就是把大的Json串重新排列,让大家能看清楚里面结构关系。
我们利用在线工具把Json节点收起,这样就会看的很清晰
``` { "swagger":"2.0", "info":{}, "host":"49.232.147.132:8080", "basePath":"/", "tags":[], "paths":{}, "securityDefinitions":{}, "definitions":{} } ```
Json中有8个主要键值对
- swagger:swagger版本号
- info:接口服务的项目信息:项目描述、名称、项目版本号等
- host:接口服务的主机名
- basePath:接口服务的起始根路径
- tags:接口服务中所有控制器的名称和描述
- paths:每个接口的详细信息:地址、参数、响应等
- securityDefinitions:接口的认证和授权方式信息
- definitions:每个接口方法中每一个参数的类型说明
下一步,我们要进入几个主要键值对中。看看哪些参数是我们关心的。
tags
``` "tags": [ { "name": "CmsPrefrenceAreaController", "description": "商品优选管理" }, { "name": "UmsMemberLevelController", "description": "会员等级管理" }, { "name": "SmsCouponHistoryController", "description": "优惠券领取记录管理" }... ] ```
paths
``` "paths": { "/admin/info": { "get": { "tags": [ "UmsAdminController" ], "summary": "获取当前登录用户信息", "operationId": "getAdminInfoUsingGET", "consumes": [ "application/json" ], "produces": [ "*/*" ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/CommonResult" } }, "401": { "description": "Unauthorized" }, "403": { "description": "Forbidden" }, "404": { "description": "Not Found" } } } }.... } ```
definitions
``` "definitions":{ "OmsUpdateStatusParam": { "type": "object", "properties": { "companyAddressId": { "type": "integer", "format": "int64", "description": "收货地址关联id" }, "handleMan": { "type": "string", "description": "处理人" }, "handleNote": { "type": "string", "description": "处理备注" }, "id": { "type": "integer", "format": "int64", "description": "服务单号" }, "receiveMan": { "type": "string", "description": "收货人" }, "receiveNote": { "type": "string", "description": "收货备注" }, "returnAmount": { "type": "number", "description": "确认退款金额" }, "status": { "type": "integer", "format": "int32", "description": "申请状态:1->退货中;2->已完成;3->已拒绝" } } }.... } ```