Swagger: изменение маршрута api в пользовательском интерфейсе swagger

У меня есть две службы kubernetes, развернутые на AKS, они получают трафик от контроллера Nginx Ingress. Конечные точки для этих двух сервисов - https:<dns>/service1 и https:<dns>/service2. Теперь я хочу настроить Swagger для каждой службы. Ниже показано, как я настроил пользовательский интерфейс Swagger для одной из служб.

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

С этой конфигурацией я могу получить доступ к чванству через https:<dns>/service1/swagger.

Теперь проблема в том, что в пользовательском интерфейсе Swagger, когда я хочу протестировать api, нажав кнопку «Попробовать», затем кнопку «Исключить», URL-адрес, по которому пользовательский интерфейс Swagger получает доступ, - https:<dns>/api/v1/contoller вместо https:<dns>/service1/api/v1/contoller. Это означает, что пользовательский интерфейс Swagger не знает о существовании пути /service1/. Я нашел несколько связанных вопросов, подобных этому Как изменить базовый URL-адрес Swagger в ядре ASP.NET . Но это не решение моей проблемы. Я предполагаю, что мне нужно установить базовый путь для Swagger. Если бы кто-нибудь мог сказать мне, как настроить базовый путь для Swagger в ASP.NET core 2.0, я был бы очень признателен.

Вы что-то придумали? С такой же проблемой и безуспешно.

ecramer 16.01.2019 17:11

@ecramer К сожалению, нет. Это должно быть распространенной проблемой при использовании чванства за Ingress, но я не могу найти ни одного сообщения или статьи, в котором упоминается об этом.

workharder 22.01.2019 17:46

почитайте этот пост: stackoverflow.com/questions/45327119/…. не обязательно самое красивое решение, но оно сработало для нас

ecramer 23.01.2019 17:24

@ecramer Действительно, это работает и для меня, большое спасибо за то, что дали мне знать.

workharder 25.01.2019 23:51
5
4
5 518
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

На основе 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

Пожалуйста, введите свой 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

Спасибо за ваш ответ. Параметр RoutePrefix фактически используется для изменения конечной точки swagger. В моем случае, если он не установлен, пользовательский интерфейс swagger может быть доступен с помощью https:<dns>/service1/swagger, если я установлю опцию c.RoutePrefix = "service1";, тогда я могу получить доступ к пользовательскому интерфейсу swagger с помощью https:<dns>/service1/service1

workharder 01.10.2018 22:22

Это не так. Изменение имени доступа swagger - это не то, что я хочу

workharder 02.10.2018 23:22

Когда вы имеете в виду, что URL-адрес меняется на service1 / service1, вы имеете в виду, когда вы обращаетесь к swagger.json? В этом случае вам необходимо заменить c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "Giftaway API V1"); на c.SwaggerEndpoint("/swagger/v1/swagger.json", "Giftaway API V1");. Вам нужно указать только базовый маршрут на c.RoutePrefix = "service1";, и этот маршрут будет работать для каждой точки. Если он вам нужен в URL-адресе службы, вам нужно добавить его на Route("api/{Controller}")] в ваших контроллерах или использовать промежуточное программное обеспечение sa, чтобы добавить путь к базовому маршруту.

ArlanG 03.10.2018 16:38

На входе не используйте эту аннотацию

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 +)

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 во время отладки на локальной машине.

Примечание: Я предполагаю, что "/ service1" - это то же значение, что и в вашем файле 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:
...

Другие вопросы по теме