c# - NSwag:从一个 API 的多个版本生成 C# 客户端

标签 c# swagger swashbuckle autorest nswag

我们正在对我们的 API 进行版本控制,并使用 ASP.NET Core 1.1 中的 Swashbuckle 生成 Swagger 规范。我们可以根据这些 JSON 规范文件生成两个 API 文档:

<!-- language: c# -->
services.AddSwaggerGen(setupAction =>
{
    setupAction.SwaggerDoc("0.1", new Info { Title = "Api", Version = "0.1", Description = "API v0.1" });
    setupAction.SwaggerDoc("0.2", new Info { Title = "Api", Version = "0.2", Description = "API v0.2" });

    // more configuration omitted
}

我们将所有操作都包含在两个规范文件中,除非使用 [MapToApiVersion] 将其映射到特定版本和 ApiExplorerSettings(GroupName ="<version>")]属性。仅属于旧版本的方法也用 [Obsolete] 修饰属性:

<!-- language: c# -->
[MapToApiVersion("0.1")]
[ApiExplorerSettings(GroupName = "0.1")]
[Obsolete]

但是,我们只想从两个规范文件的联合生成一个 C# 客户端,其中所有方法都包含在客户端中,0.1 和 0.2,但所有过时的方法实际上都标记为过时。

我研究了 NSwag(我们现在已经使用了很长一段时间)和 AutoRest。 AutoRest 似乎support a merging scenario ,但由于模式验证错误,我无法让它工作(而且我非常不确定我们的特定场景是否会得到实际支持)。

到目前为止,我最后一个想法是将规范以某种方式 JSON 合并为一个规范,然后将其提供给 NSwag。

我们在这里遗漏了什么吗?这是否有可能通过 NSwag 实现?

最佳答案

我写了一篇关于类似问题的文章https://medium.com/dev-genius/nswag-charp-client-from-multiple-api-versions-7c79a3de4622

首先,创建一个架构。如我所见,有两种方法:

  • 存在多个版本的模式
  • 每个版本都有自己的架构

接下来,为每个受支持的版本创建客户端并将它们包装在包装器客户端下:

public class AppApiClient
{
    public IV1Client V1 { get; }
    public IV2Client V2 { get; }

    public AppApiClient(HttpClient httpClient)
    {
        V1 = new V1Client(httpClient);
        V2 = new V2Client(httpClient);
    }
}

关于c# - NSwag:从一个 API 的多个版本生成 C# 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50604081/

相关文章:

c# - 使用 C# 的简单正则表达式帮助(包括正则表达式模式)

javascript - Swagger 'GET' 请求总是以 text/html 形式返回 Accept type on response 而不是 application/json

swagger - 使用 Azure API 管理时如何查看 SwaggerUi

c# - 使用 swashbuckle 将摘要或供应商扩展添加到 swagger 中的路径

c# - 将类属性作为参数传递

c# - CaSTLe Windsor 中的条件解析

c# - 为什么使用匿名类型而不是创建类

swagger - OpenAPI 重用部分定义而不定义新的

c# - OpenID 的虚张声势问题

c# - 使用 swashbuckle 在 swagger 文档中显示来自 [Route] 的名称