Swagger:在 Swagger UI 中更改 api 路由
Swagger: change api route in Swagger UI
我在 AKS 上部署了两个 kubernetes 服务,它们从 Nginx Ingress Controller 接收流量。这两个服务的端点是 https:<dns>/service1
和 https:<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 的 url UI 访问权限是 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 配置基本路径,将不胜感激。
基于https://github.com/apigee-127/swagger-tools/issues/342#issuecomment-391940961 and https://github.com/springfox/springfox/pull/1217 maybe you could try setting the X-forwarded-prefix in your ingress rule like https://github.com/kubernetes/ingress-nginx/pull/1805#issuecomment-366896998
请输入您的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
在你的入口中不要使用这个注解
nginx.ingress.kubernetes.io/rewrite-target: /
改变这个:
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
});
对此:
对于 dotnet 核心 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 prerelease+)
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 是必要的.
注意: 我假设“/service1”与 helm 图表的 values.yaml 文件中的值相同。 (见下文)
...
ingress:
enabled: true
annotations: {
kubernetes.io/ingress.class: "nginx",
nginx.ingress.kubernetes.io/rewrite-target: /
}
path: /service1/?(.*)
hosts:
- your-aks-subdomain.your-azure-region.cloudapp.azure.com
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
hpa:
...
我在 AKS 上部署了两个 kubernetes 服务,它们从 Nginx Ingress Controller 接收流量。这两个服务的端点是 https:<dns>/service1
和 https:<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 的 url UI 访问权限是 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 配置基本路径,将不胜感激。
基于https://github.com/apigee-127/swagger-tools/issues/342#issuecomment-391940961 and https://github.com/springfox/springfox/pull/1217 maybe you could try setting the X-forwarded-prefix in your ingress rule like https://github.com/kubernetes/ingress-nginx/pull/1805#issuecomment-366896998
请输入您的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
在你的入口中不要使用这个注解
nginx.ingress.kubernetes.io/rewrite-target: /
改变这个:
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
});
对此:
对于 dotnet 核心 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 prerelease+)
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 是必要的.
注意: 我假设“/service1”与 helm 图表的 values.yaml 文件中的值相同。 (见下文)
...
ingress:
enabled: true
annotations: {
kubernetes.io/ingress.class: "nginx",
nginx.ingress.kubernetes.io/rewrite-target: /
}
path: /service1/?(.*)
hosts:
- your-aks-subdomain.your-azure-region.cloudapp.azure.com
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
hpa:
...