【问题标题】:How to create a new address for each controller in Swagger如何在 Swagger 中为每个控制器创建一个新地址
【发布时间】:2021-09-30 12:41:01
【问题描述】:

我有两个控制器,分别名为 TestControllerTest2Controller。我怎么能大摇大摆地让这两个控制器有 2 个单独的 url,例如 TestController 它的地址是 baseurl/docs/test/index.html 对于Test2Controller,地址为 baseurl/docs/test2/index.html

TestController:

[Route("api/[controller]")]
[ApiExplorerSettings(GroupName = "Test")]
public class TestController : ControllerBase
{
    [ApiExplorerSettings(IgnoreApi = false)]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

Test2Controller:

[Route("api/[controller]")]
[ApiExplorerSettings(GroupName = "Test2")]
public class Test2Controller : ControllerBase
{
    [ApiExplorerSettings(IgnoreApi = false)]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

StartUp.cs

public void ConfigureServices(IServiceCollection services)
{
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("Test", new OpenApiInfo());
            c.SwaggerDoc("Test2", new OpenApiInfo());
        }
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
     app.UseSwagger();
     app.UseSwaggerUI(c =>
     {
         c.SwaggerEndpoint("/swagger/Test/swagger.json", "Test");
         c.SwaggerEndpoint("/swagger/Test2/swagger.json", "Test2");
     });
}

【问题讨论】:

  • 用路由属性装饰方法/控制器;你的大摇大摆的发电机会捡起来
  • 你能举个例子吗? @CaiusJard
  • 你想要 2 个不同的 Swagger URL 用于 2 个不同的控制器吗?
  • 是的@subhankars

标签: c# api asp.net-core controller swagger


【解决方案1】:

没有直接的方法可以实现您提到的 URL 路由。但是,您可以对它们进行分组,并为 2 个不同的控制器提供不同的 Swagger 文档。 请按照以下步骤操作:

第 1 步:如下在 ApiExplorer 设置中对您的控制器进行分组并给出组名。

''--- Controller 1
    [Route("api/[controller]")]
    [ApiExplorerSettings(GroupName = "test1")]
    public class TestController1 : Controller
    {
        // GET: api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
     }

''--- Controller 2
[Route("api/[controller]")]
    [ApiExplorerSettings(GroupName = "test2")]
    public class TestController2 : Controller
    {
        // GET: api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
     }

Step2:在startup.cs的ConfigureServices的AddSwaggerGen中添加两个swagger文档

                services.AddSwaggerGen(c => {
                c.SwaggerDoc("test1", new OpenApiInfo
                {
                    Title = "test1",
                    Version = "v1"
                });
                c.SwaggerDoc("test2", new OpenApiInfo
                {
                    Title = "test2",
                    Version = "v2"
                });
            });

第 3 步:配置 AddSwaggerUI 端点

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/test1/swagger.json", "test1");
                c.SwaggerEndpoint("/swagger/test2/swagger.json", "test2");
            });

当您使用 https://baseurl/swagger 运行 Swagger 文档时,在此配置之后,您将在右上角看到 2 个选项来选择定义

您现在可以使用以下 URL 访问控制器特定的 swagger 文档

https://baseurl/swagger/index.html?urls.primaryName=test1 -- test controller1  
https://baseurl/swagger/index.html?urls.primaryName=test2 -- test controller2

同样,要访问 Swagger json 文件,请使用以下 URL

https://baseurl/swagger/test1/swagger.json -- test controller1
https://baseurl/swagger/test2/swagger.json -- test controller2

【讨论】:

  • 对于您的 TestController,请使用 [ApiExplorerSettings(GroupName = "Test")],对于您的 Test2Controller,请使用 [ApiExplorerSettings(GroupName = "Test2")]。您的 GroupName 应与 SwaggerDoc 和 SwagerUI 名称匹配。
  • 执行第2步:您需要在AddSwaggerGen c.SwaggerDoc("test1", new OpenApiInfo { Title = "Test" }); 中为每个文档提供标题c.SwaggerDoc("Test2", new OpenApiInfo { Title = "Test2" });
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多