生成 OpenAPI 规范

页面摘要: Strapi 提供一个 CLI 工具,可自动生成 OpenAPI 3.1.0 规范,记录所有 API 端点、参数和响应。生成的规范可与 Swagger UI 集成,用于交互式 API 文档。

Strapi 提供了一个命令行工具,可为你的应用生成 OpenAPI 规范。

该 CLI 工具会自动创建全面的 API 文档,描述你的 Strapi 应用 Content API 中所有可用的端点、参数和响应格式。在可能的用例中,生成的规范随后可集成到 Swagger UI 等文档工具中。

🚧 实验性功能

OpenAPI 生成功能目前处于实验性阶段。其行为和输出在未来的版本中可能会在不遵循语义化版本规范的情况下发生变化。如需更多信息和背景,请参阅 Strapi 贡献者文档。

生成 OpenAPI 规范

OpenAPI 生成工具已包含在 Strapi 核心中,无需额外安装。你可以在任何 Strapi 项目的命令行中直接使用它来生成全面的 API 文档。

嵌套组件 `required` 元数据的已知限制

管理面板可以将组件上的内部字段标记为必填,但生成的 OpenAPI 文件可能仍会跳过这些标量(scalar)的 required 条目。父对象(例如动态区域内的组件)可能会列出 required,而嵌套属性却不会。更多背景信息见 GitHub issue #2236。因此,仅信任原始 schema 的客户端代码生成器可能会生成比 Strapi 实际强制要求更宽松的类型。

此领域仍处于实验阶段,与页面顶部的警告横幅相同,因此请继续在应用代码中使用 REST 验证辅助函数(来自控制器指南)来验证嵌套负载,而不是假设导出 JSON schema 中已镜像了每一条管理面板的规则。

CLI 用法

不带任何参数执行命令,会在你的 Strapi 项目根目录生成一个 specification.json 文件:

Yarn

yarn strapi openapi generate

NPM

npm run strapi openapi generate

你还可以传入可选的 --output 参数来指定路径和文件名,如以下示例:

Yarn

yarn strapi openapi generate --output ./docs/api-spec.json

NPM

npm run strapi openapi generate -- --output ./docs/api-spec.json

规范的结构与内容

生成的 OpenAPI 规范遵循 OpenAPI 3.1.0 标准,在以下简化示例中可以看到其大致结构:

{
  "openapi": "3.1.0",
  "x-powered-by": "strapi",
  "x-strapi-version": "5.21.0",
  "info": {
    "title": "My Strapi API",
    "description": "API documentation for My Strapi API",
    "version": "1.0.0"
  },
  "paths": {
    "/api/articles": {
      "get": {
        "operationId": "article/get/articles",
        "parameters": [
          {
            "name": "fields",
            "in": "query",
            "schema": {
              "type": "array",
              "items": { "type": "string" }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": { "$ref": "#/components/schemas/Article" }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Article": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "title": { "type": "string" },
          "content": { "type": "string" }
        }
      }
    }
  }
}
* [下载一个完整规范文件的示例](/example-openapi-spec.json)

生成的 OpenAPI 规范包含你的 Strapi 应用中所有可用的 API 端点,以及关于这些端点的信息,例如:

  • 所有内容类型的 CRUD 操作
  • 你的应用中定义的自定义 API 路由
  • 用于用户管理的身份验证端点
  • 用于媒体处理的文件上传端点
  • 已安装插件提供的插件端点

配置

默认情况下,Strapi 不会为生成的 OpenAPI 规范暴露 HTTP 端点。要启用此功能,请在 /config/server 文件中添加 openapi 键。

HTTP 端点访问

openapi 配置接受 2 个子键:content-api 和 admin,每个都带有一个 access 属性:

Sub-keyEndpointaccess valueDefaultBehavior
content-apiGET /api/openapi.jsondisabledYes端点未注册。
content-apiGET /api/openapi.jsonpublicNo端点无需身份验证即可访问。
adminGET /admin/openapi.jsondisabledYes端点未注册。
adminGET /admin/openapi.jsonauthenticatedNo端点需要已通过身份验证的管理员用户。

以下示例同时暴露这两个端点:

JavaScript

module.exports = {
  openapi: {
    'content-api': {
      access: 'public',
    },
    admin: {
      access: 'authenticated',
    },
  },
};

TypeScript

export default {
  openapi: {
    'content-api': {
      access: 'public',
    },
    admin: {
      access: 'authenticated',
    },
  },
};
WARNING

将 content-api.access 设置为 authenticated,或将 admin.access 设置为 public,会在启动时抛出错误。

NOTE

尚不支持对 OpenAPI 端点基于角色的访问控制(RBAC)。管理端点使用 admin::isAuthenticatedAdmin 策略,不会按管理员角色或权限过滤:任何已通过身份验证的管理员用户都可以读取该规范。

TIP

公开的 Content API 规范会向任何能够访问该端点的人描述你整个 Content API 的接口,包括那些并非公开可读的内容类型。如果你不想在未经身份验证的情况下暴露该规范,请将 content-api.access 保持为 'disabled',并改用 CLI 生成静态文件。

端点选项

除了 access 之外,每个端点(content-api 和 admin)还接受以下选项:

OptionTypeDefaultDescription
route.pathString'/openapi.json'提供规范的子路径。对于 content-api 解析在 /api 之下,对于 admin 解析在 /admin 之下。
cache.enabledBooleantrue启用生成规范的基于文件的缓存。
cache.maxAgeMsNumber60000缓存文件的最大存活时间,单位毫秒,超过后规范会重新生成。
cache.filePathString.strapi/openapi/<type>.json缓存文件的路径。相对路径从应用根目录解析。

使用默认的 route.path 时,Content API 端点的完整 URL 为 http://localhost:1337/api/openapi.json,Admin 端点为 http://localhost:1337/admin/openapi.json。

WARNING

两个端点必须解析到不同的完整路径。如果 content-api 和 admin 端点解析到相同的 URL,Strapi 会在启动时抛出错误。

与 Swagger UI 集成

TIP

如果你 暴露了 HTTP 端点,可以将 Swagger UI 直接指向实时的 URL(例如 http://localhost:1337/api/openapi.json),而无需生成静态文件。请跳过下面的第 1 步,并在第 3 步中将端点 URL 作为 url 的值使用。

通过以下步骤,你可以快速生成一个兼容 Swagger UI 的页面:

  1. 生成规范:

    Yarn

    yarn strapi openapi generate --output ./public/swagger-spec.json
    

    NPM

    npm run strapi openapi generate -- --output ./public/swagger-spec.json
    
  2. 使用以下代码更新 the /config/middlewares.js 配置文件:

    JavaScript

    module.exports = [
      'strapi::logger',
      'strapi::errors',
      {
        name: 'strapi::security',
        config: {
          contentSecurityPolicy: {
            useDefaults: true,
            directives: {
              'script-src': ["'self'", "'unsafe-inline'", 'https://unpkg.com'],
              'style-src': ["'self'", "'unsafe-inline'", 'https://unpkg.com'],
              'connect-src': ["'self'", 'https:'],
              'img-src': ["'self'", 'data:', 'blob:', 'https:'],
              'media-src': ["'self'", 'data:', 'blob:'],
              upgradeInsecureRequests: null,
            },
          },
        },
      },
      'strapi::cors',
      'strapi::poweredBy',
      'strapi::query',
      'strapi::body',
      'strapi::session',
      'strapi::favicon',
      'strapi::public',
    ];
    

    TypeScript

    export default [
      'strapi::logger',
      'strapi::errors',
      {
        name: 'strapi::security',
        config: {
          contentSecurityPolicy: {
            useDefaults: true,
            directives: {
              'script-src': ["'self'", "'unsafe-inline'", 'https://unpkg.com'],
              'style-src': ["'self'", "'unsafe-inline'", 'https://unpkg.com'],
              'connect-src': ["'self'", 'https:'],
              'img-src': ["'self'", 'data:', 'blob:', 'https:'],
              'media-src': ["'self'", 'data:', 'blob:'],
              upgradeInsecureRequests: null,
            },
          },
        },
      },
      'strapi::cors',
      'strapi::poweredBy',
      'strapi::query',
      'strapi::body',
      'strapi::session',
      'strapi::favicon',
      'strapi::public',
    ];
    

    这将确保来自 unpkg.com 的 Swagger UI 显示不会被 安全中间件 处理的 Strapi CSP 策略所阻止。

  3. 在你的 Strapi 项目中创建一个 public/openapi.html 文件以显示 Swagger UI,代码如下:

    <!DOCTYPE html>
    <html>
      <head>
        <title>API Documentation</title>
        <link
          rel="stylesheet"
          type="text/css"
          href="https://unpkg.com/swagger-ui-dist@5.0.0/swagger-ui.css"
        />
      </head>
      <body>
        <div id="swagger-ui"></div>
        <script src="https://unpkg.com/swagger-ui-dist@5.0.0/swagger-ui-bundle.js"></script>
        <script src="https://unpkg.com/swagger-ui-dist@5.0.0/swagger-ui-standalone-preset.js"></script>
        <script>
          window.onload = function () {
            SwaggerUIBundle({
              url: './swagger-spec.json',
              dom_id: '#swagger-ui',
              presets: [
                SwaggerUIBundle.presets.apis,
                SwaggerUIStandalonePreset
              ],
              layout: 'StandaloneLayout',
            });
          };
        </script>
      </body>
    </html>
    
  4. 使用 yarn develop 或 npm run develop 重启 Strapi 服务器,并访问 /openapi.html 页面。Swagger UI 应当会被显示:

    使用 Strapi OpenAPI 规范的 Swagger UI 示例