提供单独的 OpenApi 定义

att*_*and 5 openapi quarkus

我们有一项服务提供 2 个独立的 Rest API。一种是我们的客户使用的简单 API,另一种是 Web 应用程序使用的内部 API。

\n

我们的客户无法访问 Web API,因此我希望能够提供 2 种独立的 OpenApi 规范,一种适用于我们的客户,另一种适用于我们的 Web 开发人员。

\n

我找到了一种非常简单的方法来实现我想要的目标,即创建端点、检索 OpenApi 文档并过滤掉属于客户 API 的标签。

\n
@Inject\nOpenApiDocument document;\n\n@Operation(hidden = true)\n@GET\n@Produces("application/yaml")\npublic Response customer() throws IOException {\n    OpenAPI model = FilterUtil.applyFilter(new MyTagFilter("mytag"), document.get());\n\n    String result = OpenApiSerializer.serialize(model, Format.YAML);\n\n    return Response.ok(result).build();\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

一个问题是,在开发模式下注入的 OpenApiDocument 实例为 null。OpenApiDocumentProducer 似乎缺少 OpenApiHandler 类中存在的一些类加载器魔法。另一个小问题是过滤器 \xe2\x80\x9cMyTagFilter\xe2\x80\x9d 还需要过滤掉任何标记的 PathItem 未使用的模式,并且代码变得有些狡猾。

\n
    \n
  • 有更好的方法来解决我的问题吗?
  • \n
  • 是否可以修复 OpenApiDocumentProducer 以在开发人员模式下提供非空且最新的 OpenApiDocument?
  • \n
\n

类似问题:Quarkus:提供多个 OpenApi/Swagger-UI 端点

\n

Bor*_*dov 1

不幸的是,据我所知,不可能有两个单独的 OpenAPI 规范。但是,您可以考虑以下几种解决方法:

  • 第一个选项是将 API 分成两个单独的 Quarkus 应用程序。这样,每个 API 都会有自己的 OpenAPI 规范。

  • 另一种选择是将所有端点包含在单个 OpenAPI 规范中,甚至包括您不想公开公开的内部端点。然后,生成规范后,您可以使用 YAML 库对 openapi.yaml 文件进行后处理并删除内部端点。这将为您提供一个干净的规范,您可以将其导入到 Swagger UI 中。请记住,您必须通过身份验证来保护内部端点。