Swagger:在Swagger UI中更改API路由

ndasle7k  于 2023-11-18  发布在  其他
关注(0)|答案(5)|浏览(195)

我在AKS上部署了两个kubernetes服务,它们从Nginx Ingress Controller接收流量。这两个服务的端点是https:<dns>/service1https:<dns>/service2。现在我想为每个服务设置Swagger。下面是我如何为其中一个服务设置Swagger UI。

app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
        });

字符串
通过这种配置,我可以通过https:<dns>/service1/swagger访问swagger。
现在的问题是,在Swagger UI中,当我想通过单击“Try it out”按钮然后执行按钮来测试API时,Swagger UI访问的URL是https:<dns>/api/v1/contoller而不是https:<dns>/service1/api/v1/contoller。这意味着Swagger UI不知道路径/service1/的存在。我发现了几个类似How to change base url of Swagger in ASP.NET core的相关问题。但它们不是我问题的解决方案。我猜我需要为Swagger设置一个基本路径。如果有人能告诉我如何在ASP.NET核心2.0中为Swagger配置基本路径,我将不胜感激。

nbysray5

nbysray51#

更改此:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
});

字符串
对此:

dotnet core 2.x

app.UseSwagger(c =>
{
#if !DEBUG
  c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.BasePath = "/service1");
#endif
});
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("./swagger/v1/swagger.json", "API V1");
});

对于dotnet核心3.x(Swashbuckle 5.x预发布+)

app.UseSwagger(c =>
{
#if !DEBUG
  c.RouteTemplate = "swagger/{documentName}/swagger.json";
  c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.Servers = new System.Collections.Generic.List<OpenApiServer>
  {
    new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}/service1" }
  });
#endif
});
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("./swagger/v1/swagger.json", "API V1");
});

#if!DEBUG.#endif是在本地调试时访问swagger ui所必需的。
**注意:**我假设“/service 1”与您的helm chart的values.yaml文件中的值相同。(见下文)

...
ingress:
  enabled: true
  annotations: {
    kubernetes.io/ingress.class: "nginx",
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  }
  path: /service1/?(.*)
  hosts:
    - your-aks-subdomain.your-azure-region.cloudapp.azure.com
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

hpa:
...

eimct9ow

eimct9ow2#

请输入您的public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
在此之后使用:

app.UseSwaggerUI(c=>
              {
                   c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "Giftaway API V1");

字符串
此选项

c.RoutePrefix = "service1";


这将得到https:<dns>/service1/api/v1/controller

6pp0gazn

6pp0gazn3#

基于https://github.com/apigee-127/swagger-tools/issues/342#issuecomment-391940961和https://github.com/springfox/springfox/pull/1217,也许你可以尝试在你的入口规则中设置X-forwarded-prefix,比如https://github.com/kubernetes/ingress-nginx/pull/1805#issuecomment-366896998

k4aesqcs

k4aesqcs4#

在你的入口不要使用这个注解
nginx.ingress.kubernetes.io/rewrite-target:/

fae0ux8s

fae0ux8s5#

我使用的是带有Swashbuckle的ASP.NET Core 6。AspNetCore 6.5和UNOPARATOR需要更改才能工作:

app.UseSwagger(c =>
        {
#if !DEBUG

            c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.Servers = new List<OpenApiServer>
            {
                // {httpReq.Scheme} is http on deployed version, so hardcoding https
                new OpenApiServer { Url = $"https://{httpReq.Host.Value}/serviceName" }
            });
#endif
        });
        app.UseSwaggerUI();

字符串
我不明白的是为什么httpReq.Scheme在部署时返回http,但是我到处都有https,所以我可以安全地硬编码(尽管对此不满意)。

相关问题