解析 Swagger JSON 数据并将其存储在 .net 类中

5
我希望能够从{service}/swagger/docs/v1获取的JSON数据中解析Swagger数据并生成动态生成的.NET类。
我面临的问题是不同的API可能会有不同数量的参数和操作。我应如何动态解析不同服务的Swagger JSON数据?
我的最终结果应该是所有API及其操作列表,存储在一个变量中,方便进行搜索。
2个回答

0
你有找到这个问题的答案吗?今天我也想做同样的事情,所以我使用了微软的开源项目AutoRest https://github.com/Azure/autorest。虽然它看起来是为生成客户端代码(用于消费由Swagger文档记录的API的代码)而设计的,但在生成此代码的过程中,它必须按照你在问题中提出的要求执行 - 解析Swagger文件并理解API支持的操作、输入和输出。
事实上,我们可以获取这些信息 - AutoRest公开了这些信息。
因此,使用NuGet安装AutoRest。然后添加对AutoRest.core和AutoRest.Model.Swagger的引用。到目前为止,我只是简单地进行了以下操作:
using Microsoft.Rest.Generator;
using Microsoft.Rest.Generator.Utilities;
using System.IO;

...

        var settings = new Settings();
        settings.Modeler = "Swagger";

        var mfs = new MemoryFileSystem();
        mfs.WriteFile("AutoRest.json", File.ReadAllText("AutoRest.json"));
        mfs.WriteFile("Swagger.json", File.ReadAllText("Swagger.json"));
        settings.FileSystem = mfs;
        var b = System.IO.File.Exists("AutoRest.json");

        settings.Input = "Swagger.json";

        Modeler modeler = Microsoft.Rest.Generator.Extensibility.ExtensionsLoader.GetModeler(settings);
        Microsoft.Rest.Generator.ClientModel.ServiceClient serviceClient;
        try
        {
            serviceClient = modeler.Build();
        }
        catch (Exception exception)
        {
            throw new Exception(String.Format("Something nasty hit the fan: {0}", exception.Message));
        }

您想要解析的Swagger文档名为Swagger.json,位于您的bin目录中。您可以从他们的GitHub(https://github.com/Azure/autorest/tree/master/AutoRest/AutoRest.Core.Tests/Resource)获取AutoRest.json文件。我不确定它的使用方式,但似乎需要用它来告知工具支持什么。这两个JSON文件都需要在您的bin目录中。

serviceClient对象是您想要的。它将包含有关方法、模型类型和方法组的信息。

如果这样行得通,请告诉我。您可以尝试使用他们的资源文件。当我在玩耍时,我使用了他们的ExtensionLoaderTests作为参考(https://github.com/Azure/autorest/blob/master/AutoRest/AutoRest.Core.Tests/ExtensionsLoaderTests.cs)。

(同时感谢AutoRest的作者Denis)


嗨@friartuck,我找不到NuGet包。你有时间的时候能更新一下答案吗? - Anand Murali

-2
如果您还有疑问,可以使用Swagger Parser库:

https://github.com/swagger-api/swagger-parser 只需简单的操作:

// parse a swagger description from the petstore and get the result
SwaggerParseResult result = new OpenAPIParser().readLocation("https://petstore3.swagger.io/api/v3/openapi.json", null, null);
  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接