从 yaml 文件创建 public 和私有打开 API 文档

Creating public and private Open API documentation from yaml file

我有一个 OpenAPI 文档来描述一些端点。其中一些端点应 public(最终用户可见)和其他端点私有(仅对开发团队可见)。

我想知道是否有办法只创建 1 个包含所有 api 方法的 yaml 文件并生成 2 个文档页面(1 个用于 public 端点,其他用于私有)。是否有标志或配置允许我区分端点类型并使其可见或隐藏?

我还需要在请求级别执行此操作。在某些端点中,请求正文具有一些 "private" 属性(最终用户不应该知道)。假设第一个陈述是正确的(有一种方法可以从单个 YAML 文件创建 2 api 文档),在应用 public 别名文档时是否可以隐藏一些请求模型属性?

对于那些对如何实现这一点有疑问的人,我就是这样做的:

  • 我创建了一组对 OpenApi 透明的私有关键字(它们是普通字符串)
  • 我还创建了一个 python 脚本来浏览 yaml 文件,每次它找到这些私有关键字之一时,它都会删除它包含的 yaml 节点。

问:我是如何为端点做到这一点的? 答:我在 "tags" 部分创建了一个名为 Private 的部分,所有私有端点都必须引用它。这就是我删除专用端点的方式。

问:我是如何为属性做到这一点的? A:在属性(或我想设为私有的任何元素)"description" 标签中,我添加关键字“Private”。因此,如果我的脚本在描述中找到此字符串,则该元素将被删除。

当然,对于我创建的私有 OpenApi yaml 文件,我用来生成 public 版本的这些标签仍然存在。但是因为它们只是字符串,所以没什么大不了的。

为了通过 yaml 文件导航,我使用了以下 python 库:ruamel

所以我一直在文件中递归导航,搜索标签称为 "Private" 的 OpenApi 操作或描述标签包含字符序列“Private 的属性“

为多个使用环境实例化同一个 OpenAPI 文件是一种常见的需要。 经典的解决方案是 copy-paste 您的文件,但在可维护性方面不是很好! 因为我有同样的需求,所以我自己写了一个工具“OpenAPI Dev Tool”(参见github)。

使用此工具,您可以只设计一个 API 并将其实例化用于多个上下文(例如私有/public),而无需重复任何行或文件(它使用 EJS 模板引擎)。

例如,您可以定义这样的配置文件:

{
"folder": "./specs", 
"specs": [           
    {
        "file": "/petstore.yaml",
        "context": {
          private: true
        }
    },
    {
        "file": "/petstore.yaml"
        "context": {
          private: false
        }
    }
]
}

其中指定了相同的 YAML 文件,但用于 2 个不同的上下文(public / 私有)。

并且在您的 petstore.yaml 中,您可以拥有:

openapi: 3.0.0
...

components:
<%if (public) { %>
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
<% } %>

...

<%if (public) { %>
security:
- basicAuth: []
<% } %>
...

最后,将从同一个 YAML 文件生成 2 个规范,但对于这 2 个上下文 :)