在 Node.js 中使用 Yaml 编写API文档

简介: 在文章《使用Node.js、MongoDB、Fastify 构建API服务》中介绍使用 Swagger 构建 API 文档,编写文档不是那么的顺手,本文介绍另一种编写 API 文档的方式,即使用 Yaml ,将API文档与其实现完全分开。

在文章《使用Node.js、MongoDB、Fastify 构建API服务》中介绍使用 Swagger 构建 API 文档,编写文档不是那么的顺手,本文介绍另一种编写 API 文档的方式,即使用 Yaml ,将API文档与其实现完全分开。

文章将继续在项目 restful-api 基础上进行迭代,首先先来简单了解一下 Yaml。

什么是 Yaml

YAML 是一种常用于数据序列化的文件格式,有很多项目使用 YAML 文件进行配置,常见的有 docker-composeESLintKubernetes 等等。最初代表 Yet Another Markup Language ,后来改为 YAML Ain't Markup Language ,以区别于真正的标记语言。

它类似于 XML 和 JSON 文件,但使用更简约的语法,即使在保持类似功能的同时也是如此。YAML 是 JSON 的超集(来源),每个有效的 JSON 文件也是一个有效的 YAML 文件。前面 Swagger 文档就是需要构建一个 JSON 数据,正好利用 YAML 的这个特性。

YAML 文件使用类似于 Python 的缩进系统来显示程序的结构,需要使用空格而不是制表符来创建缩进以避免混淆。

编写 Yaml

在项目目录 src/docs 中创建文件 api.yaml,添加以下代码:

openapi: 3.0.1
info:
    description: 这是一个关于咖啡种类的 API。
    title: Coffee Restful API
    version: 1.0.0
servers:
    - description: Main server
      url: http://localhost:8100/api/v1
paths:
    /coffees:
        get:
            operationId: coffeesGET
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                items:
                                    $ref: "#/components/schemas/Coffee"
                                type: array
                                x-content-type: application/json
                    description: 获取成功
            description: 获取咖啡种类列表
            summary: 获取所有的咖啡种类列表
            tags:
                - Coffees
        post:
            operationId: coffeesPOST
            requestBody:
                content:
                    application/json:
                        schema:
                            $ref: "#/components/schemas/CoffeeRequest"
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                items:
                                    $ref: "#/components/schemas/Coffee"
                                type: array
                                x-content-type: application/json
                    description: 创建成功
            description: 增加新的咖啡种类
            summary: 创建新的咖啡种类
            tags:
                - Coffees
    /coffees/{id}:
        get:
            operationId: coffeesIdGET
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            responses:
                "200":
                    content:
                        application/json:
                            schema:
                                $ref: "#/components/schemas/Coffee"
                    description: 获取详情成功
            description: 通过id获取咖啡种类详情
            summary: 获取咖啡种类详情
            tags:
                - Coffees
        delete:
            operationId: coffeesIdDELETE
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            responses:
                "204":
                    description: 删除成功
            description: 通过id删除咖啡种类详情
            summary: 删除咖啡种类详情
            tags:
                - Coffees
        put:
            operationId: coffeesIdPUT
            parameters:
                - description: 咖啡种类id
                  explode: false
                  in: path
                  name: id
                  required: true
                  schema:
                      type: string
                  style: simple
            requestBody:
                content:
                    application/json:
                        schema:
                            $ref: "#/components/schemas/CoffeeRequest"
            responses:
                "201":
                    content:
                        application/json:
                            schema:
                                $ref: "#/components/schemas/Coffee"
                    description: 更新成功
            description: 通过id 更新咖啡种类详情
            summary: 更新咖啡种类详情
            tags:
                - Coffees
components:
    schemas:
        Coffee:
            example:
                _id: id
                title: title
                ratio: ratio
                cup: cup
                description: description
            properties:
                _id:
                    maxLength: 24
                    minLength: 24
                    type: string
                title:
                    type: string
                ratio:
                    type: string
                cup:
                    type: string
                description:
                    type: string
            type: object
        CoffeeRequest:
            example:
                title: "Red Eye"
                ratio: "1 shot of espresso"
                cup: "8 oz. Coffee Mug"
                description: description
            properties:
                title:
                    type: string
                ratio:
                    type: string
                cup:
                    type: string
                description:
                    type: string
            type: object

修改配置 src/config/swagger.js ,完整代码如下:

exports.options = {
    routePrefix: "/api/v1/helper",
    exposeRoute: true,
    yaml: true,
    mode: "static",
};

去掉路由中与文档相关的信息,修改文件 src/routes/index.js,完整代码如下:

const coffeeController = require("../controllers/coffeeController");
const APIPATH = "/api/";
const VERSION = "v1";
const ENDPOINT = "/coffees";
const getFullPath = (method = "") => `${APIPATH}${VERSION}${ENDPOINT}${method}`;
const routes = [
    {
        method: "GET",
        url: getFullPath(),
        handler: coffeeController.getList,
    },
    {
        method: "GET",
        url: getFullPath("/:id"),
        handler: coffeeController.get,
    },
    {
        method: "POST",
        url: getFullPath(),
        handler: coffeeController.add,
    },
    {
        method: "PUT",
        url: getFullPath("/:id"),
        handler: coffeeController.update,
    },
    {
        method: "DELETE",
        url: getFullPath("/:id"),
        handler: coffeeController.delete,
    },
];
module.exports = routes;

修改入口文件 src/index.js,主要是修改 swagger 的部分,如下:

fastify.register(require("fastify-swagger"), {
    ...swagger.options,
    specification: {
        path: path.join(__dirname, "./docs", "api.yaml"),
        postProcessor: function (swaggerObject) {
            return swaggerObject;
        },
    },
});

运行后打开 API  文档路径,可以看到下面效果:

image.png



相关文章
|
2天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
12天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
34 4
|
5天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
28天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
16 0
|
1月前
|
JSON JavaScript API
Node.js RESTful API
10月更文挑战第8天
13 0
|
2天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
14天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
15天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
25天前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
5天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释

热门文章

最新文章