Установить собственный префикс пути в методе API с помощью Swagger в .Net Core - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы добавить мой собственный префикс пути , используя swagger в методах API .Net Core.

Например, мои методы API объявлены так:

[Route("api/v1/Customer")]
[HttpGet]
public async Task<IActionResult> Customer()
{
        // some implementation
        return Ok();
}

Итак, в настоящее время, если я вызываю API, используя http://localhost:50523/api/v1/Customer, он работает отлично.

Теперь я хочу добавить собственный префикс пути .Например, /some/custom/path/ перед фактическим путем метода API.Это означает, что - если я вызываю API, используя http://localhost:50523/some/custom/path/api/v1/Customer, он должен работать.

Я хочу добиться этого, используя Swagger в ядре .Net, и не хочу менятьПуть API на уровне метода действия , поскольку у меня написано сто методов API, и я не хочу менять URL-адрес для каждого метода действия.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Если вы добавите DocumentFilter, вы можете добавить префикс ко всем путям, которые вы хотите изменить.

public class PathPrefixInsertDocumentFilter : IDocumentFilter
{
    private readonly string _pathPrefix;

    public PathPrefixInsertDocumentFilter(string prefix)
    {
        this._pathPrefix = prefix;
    }

    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        var paths = swaggerDoc.Paths.Keys.ToList();
        foreach (var path in paths)
        {
            var pathToChange = swaggerDoc.Paths[path];
            swaggerDoc.Paths.Remove(path);
            swaggerDoc.Paths.Add(new KeyValuePair<string, PathItem>("/" + _pathPrefix + path, pathToChange));
        }
    }
}

Затем вы добавляете фильтр в настройке сваггера:

        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info {Title = "MyApp", Version = "v1"});

            ...  other setup

            options.DocumentFilter<PathPrefixInsertDocumentFilter>("api");
        });

Это не меняет ваш API - мы используем это для работы с обратным прокси в рабочей среде, где мы используем префикс для направления запроса в соответствующий контейнер, но удаляем его.

0 голосов
/ 31 июля 2019

вы можете использовать [Route("prefix/[controller]")] верх вашего контроллера API

[Route("prefix/[controller]")]
public class MyController : ControllerBase
{
  [Route("api/v1/Customer")]
  [HttpGet]
   public async Task<IActionResult> Customer()
   {
    // some implementation
    return Ok();
    }
}
0 голосов
/ 19 декабря 2018

Может быть, вы можете использовать атрибут Route в вашем классе контроллера, как: [Route("/some/custom/path/")] public class CustomerController { [Route("api/v1/Customer")] [HttpGet] public async Task<IActionResult> Customer() { // some implementation return Ok(); } }

Надеюсь, он работает для вас

...