本章学习目标:
- 了解什么是Swagger
- 理解OpenAPI规范
- 能够编写简单的OpenAPI定义
- 了解Swagger生态构建工具
Swagger 是一套围绕OpenAPI规范构建的开源工具,可以帮助开发人员设计、构建、记录和使用REST API。主要的Swagger工具包括:
除了使用Swagger提供的工具之外,我们还可以在项目中使用Swagger提供的API文档库,配合Spring Boot可以很方便的生成对应的REST API接口文档,具体关于Spring Boot应用整合Swagger内容将在后文详细介绍。
既然Swagger 是基于OpenAPI规范的,那么我们有必要了解一下OpenAPI规范具体内容。
OpenAPI规范(以前成为Swagger规范)是Linux基金会的一个开源项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。OpenAPI规范可以帮助我们描述一个API的基本信息,包括:
描述API自身结构是OpenAPI最根本的能力,编写完成后,OpenAPI规范和Swagger工具可以通过各种方式进一步推动您的API开发:
现在我们知道想要使用Swagger我们需要根据OpenAPI规范编写符合规范的OpenAPI定义,那么我们如何来编写OpenAPI定义呢?我们可以使用YAML或者JSON语言格式来编写API定义文档,但官方更推荐以YAML方式,如下所示:
openapi: 3.0.0
info:
title: Sample API
description: #可以使用单行或多行markdown或者HTML描述
version: 0.0.1
servers:
- url: #http://api.example.com/v1
description: #可选服务器描述,例如生产服务器
- url: http://staging-api.example.com
description: #可选服务器描述,例如测试服务器
paths:
/users:
get:
summary: #接口摘要,例如:返回用户列表
descriotion: #可选扩展描述,可以用markdown或者HTML
responses:
'200': # status code
description: #描述信息
content:
application/json:
schema:
type: array
items:
type: string
注意: 所有关键字名称都区分大小写。
在上面的OpenAPI定义文件中,包含了一个API接口文档所需要的基本信息,下面我们针对各个部分详细说明。
每个API定义必须包含此定义所基于的OpenAPI规范的版本:
openapi: 3.0.0
OpenAPI版本定义了API定义的整体结构,info部分包含了API的基本信息:title,description(可选),version。其中title是API的名称,description是有关API的描述信息,它可以是单行或者多行文本,支持Markdown或HTML。version是API的版本号。
servers部分用于指定API所属服务器和基本URL,可以定义一个或者多个服务器,例如生产环境和沙箱环境:
servers:
- url: http://api.example.com/v1
description: 可选的描述信息
- url: http://staging-api.example.com
description: 可选的描述信息
这里需要注意,所有的API路径都与服务器URL相关,比如1.4.1的示例中,/users表示http://api.example.com/v1/users或http://staging-api.example.com/v1/users,具体路径取决于所在服务器的URL。
paths部分定义了API中的各个端点(路径)以及这些端点支持的HTTP方法,例如 GET /users可以描述为:
paths:
/users:
get:
summary: #接口摘要
description: 可选描述信息
responses:
'200':
description: 描述信息
content:
application/json
schema:
type: array
items:
types: string
操作定义包括参数、请求主体(如果有)、可能的响应状态码(例如200 OK或404 Not Found)和响应内容,具体更多信息,将在后文详细介绍。
操作可以通过URL path (/users/{userId}),query string(/usesrs?role=admin),headers(x-CustomHeader: value)或cookies(Cookie:debug=0)传递参数,并且可以定义参数的数据类型、格式、是否为必需或可选,以及其他详细信息:
paths:
/users/{userId}:
get:
summary: Returns a user by ID.
parameters:
- name: userId
in: path
required: true
description: Parameter description in CommonMark or HTML.
schema:
type: integer
format: int64
minimun: 1
responses:
'200':
description: OK
有关更多参数定义,将在后文详细介绍。
如果操作发送一个请求体,需要使用requestBody关键字来描述请求体内容和媒体类型:
paths:
/users:
post:
summary: Creates a user.
requestBody:
required: true
content:
application/json
schema:
type: object
properties:
username:
type: string
responses:
'201':
description: Created
对于每个操作,可以定义可能的状态码,例如200 OK或404 Not Found,以及响应正文schema。Schemas可以被定义为内联或通过变量$ref引用,还可以为不同的内容类型提供示例响应:
paths:
/users/{userId}:
get:
summary: 根据ID查询用户信息
parameters:
- name: userId
in: path
required: true
description: 用户的ID
schema:
type: integer
format: int64
minimum: 1
responses:
'200':
description: 用户对象
content:
application/json
schema:
type: object
properties:
id:
type: integer
format: int64
example: 4
name:
type: string
example: James
'400':
description: 无效的用户ID
'404':
description: 未找到指定的用户
default:
description: 未知错误
请注意,响应HTTP状态码必须用引号括起来:‘200’。
在OpenAPI定义文件中,全局components/schemas部分允许你定义API中使用的公共数据结构。可以使用变量$ref在各种schema中引用,比如:参数、请求体、响应体,例如下面这个JSON对象:
{
"id":4,
"name":"Arthur Dent"
}
可以表示为:
components:
schemas:
User:
properties:
id:
type: integer
name:
type: string
# 两个属性都是必需的
required:
- id
- name
然后在请求体模式和响应体模式中引用,如下所示:
paths:
/users/{userId}:
get:
summary: 根据用户ID返回一个用户对象
parameters:
- in: path
name: userId
required: true
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/User'
/users:
post:
summary: 创建一个用户
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
'201':
description: Created
在OpenAPI定义中,我们可以使用关键字securitySchemes和security来描述API中使用的身份认证方法,如下所示:
components:
securitySchemes:
BasicAuth:
type: http
scheme: basic
security:
- BasicAuth: []
支持的身份验证方法有:
具体身份验证方法定义,将在后文详细介绍。
本章主要从Swagger的作用及相关概念出发,重点介绍了如何使用OpenAPI规范定义API接口,学习本章可以简单了解OpenAPI规范,掌握简单的API接口定义方法,后续章节将从各个知识点逐步深入介绍完整的Swagger技术要点。