OpenApi(Redoc)远程(网络)嵌套引用



我们有一个正在运行的Redoc服务器,它包括一堆带有api规范的yaml文件。然而,有几个必要的yaml文件不在本地机器上(我们称之为RedocServer(。

这些远程文件可以通过aspnet-webapi服务(WebApiServer(访问。

因此,假设要获得其中一个文件,我们在index.yaml文件中使用reference:

paths: 
/api/1:
$ref: "https:/some-address/ApiDoc.yaml"

如果ApiDoc.yaml本身没有引用,那么WebApiServer使用以下方法简单地返回字符串是没有问题的:

[HttpGet]
public string GetApiDoc()
{
var directoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var filePath = Path.Combine(directoryPath, "ApiDoc.yaml");
return File.ReadAllText(filePath);
}

然而,在我们的例子中,ApiDoc.yaml中有一些对另一个文件的巨大嵌套引用

post:
tags:
- Test
summary: Test
operationId: Test
consumes:
- application/json
produces:
- application/json
requestBody:
content:
application/json:
schema:
$ref: "../ApiDoc2.yaml#/components/schemas/ApiRequest"
responses:
200:
description: OK
content:
application/json:
schema:
$ref: "../ApiDoc3.yaml#/components/schemas/ApiResponse"

如果WebApiServer返回类似的字符串,RedocServer可能只会尝试使用RedocServer件解析这些引用。但我们显然希望确保引用将在WebApiServer端得到解决。

所以,问题是,如何在不破坏任何引用的情况下正确返回ApiDoc.yaml?

我们无法手动解析引用,因为对象很大并且嵌套很深。我们尝试使用的OpenApi.net仍然无法自动解析远程引用,而且似乎也无法处理没有"信息"one_answers"OpenApi:3.0.0"部分的文件。

事实证明,Redoc自动解析远程引用,将url中的本地路径替换为远程url。

简单地说:你可以返回一个字符串或类似的文件,一切都应该正常。

最新更新