在远程服务器上托管可重用的组件定义,并在 open api spec 3.0 中将它们用作 $ref

Posted

技术标签:

【中文标题】在远程服务器上托管可重用的组件定义,并在 open api spec 3.0 中将它们用作 $ref【英文标题】:Hosting reusable component definitions on remote server and use them as $ref in open api spec 3.0 【发布时间】:2018-12-28 18:06:12 【问题描述】:

我正在尝试在 OAS 3.0(OpenAPI 规范 3.0)中创建可重用组件定义并通过 $ref 引用它们进行 POC。我在下面尝试过:

    在我的本地计算机上下载了 Swagger 编辑器。 在我的本地计算机上创建了一个文件,其中包含我们希望跨多个 API 重复使用的公共响应。 在规范中给出了该文件的引用 - "$ref": "file:///path of local directory/myreference.json"

输出不反映我引用的文件的内容。我在这里做错了吗?

还想知道,如果我们在 GitHub 等存储库上托管此类规范,那么它们是否会正确解析引用,以及它们是否可以被某些 CMS 系统获取以呈现 UI?

感谢有关此问题的任何指示。

【问题讨论】:

浏览器控制台有错误吗? 嗨 Helen,控制台上没有错误,但它没有反映编辑器中的输出。 【参考方案1】:

虽然$ref: file:///path 是有效的 JSON 引用[1],但您不应使用它们,因为它们不可移植。相反,请使用 $ref: '../relative/path/to/file.yaml' 或类似的相对引用,如 lordrhodos's answer 中所建议的那样。

$ref: file:///... 在 Swagger UI 和 Swagger Editor 中不起作用的原因是它们是网页并使用 javascript 来解析定义,浏览器出于安全原因拒绝从 JavaScript 访问 file:/// 方案。

您能否推荐一个可用于托管可重用定义文件的站点?

SwaggerHub 为 OpenAPI 定义提供云托管。可重用组件(架构定义、响应等)可以存储在所谓的“域”文件中,并在多个 API 定义中使用。

披露:我为制作 SwaggerHub 的公司工作


[1]根据JSON Reference Specification:

“$ref”字符串值包含一个URI [RFC3986],

file:///... 是一个有效的URI。

【讨论】:

【参考方案2】:

海吉·桑托什,

OpenAPI 不支持语言环境文件系统引用的绝对路径。来自documention over at swagger.io 您可以看到,在您的情况下,您想尝试使用 Remote Reference 方法来处理 位于另一个文件夹中的文档元素 场景,使用到您的规范位置的相对路径:

本地参考 - $ref: '#/definitions/myElement' # 表示转到当前文档的根目录,然后依次查找元素定义和myElement。 远程参考$ref: 'document.json' 使用位于同一服务器和同一位置的整个文档。 位于同一服务器上的文档元素$ref: 'document.json#/myElement' 位于父文件夹中的文档元素$ref: '../document.json#/myElement' 位于另一个文件夹中的文档元素$ref: '../another-folder/document.json#/myElement' URL 参考$ref: 'http://path/to/your/resource' 使用位于不同服务器上的整个文档。 存储在不同服务器上的文档的特定元素 - $ref: 'http://path/to/your/resource.json#myElement' 不同服务器上的文档,使用相同的协议(例如,HTTP 或 HTTPS) - $ref: '//anotherserver.com/files/example.json'

【讨论】:

嗨@lordrhodos,谢谢您的回复。您能否推荐一个可用于托管可重用定义文件的站点? 您可以使用任何公开的托管服务提供商或重新使用您“拥有”的任何域来托管文件。我建议您使用speccy 来验证您的规范。您还将获得基于 ReDoc 的精美文档预览。

以上是关于在远程服务器上托管可重用的组件定义,并在 open api spec 3.0 中将它们用作 $ref的主要内容,如果未能解决你的问题,请参考以下文章

制作自定义SSIS包以供重用

如何编写可重用的组件/模块?

如何在反应中使用自定义可重用组件作为输入字段

在 react 组件定义中使用 props 和其他属性

如何在asp.net核心应用程序中执行open office calc(宏)

Angular Material mat-table 在组件中定义可重用列