Ремонт: версионные маршруты - PullRequest
0 голосов
/ 02 апреля 2020

Мы использовали Refit на одном из ваших API для создания и публикации клиентского пакета для этого API.

ICategoryApi.cs

[Post("/category")]
Task CreateCategoryAsync([Body] CategoryCommandDto createCategoryCommandDto);

и все работало нормально с таким контроллером, как

CategoryController.cs

[ApiController]
[Route("[controller]")]
public class CategoriesController : ControllerBase
{
    [HttpPost]
    [ProducesResponseType((int)HttpStatusCode.Created)]
    [ProducesResponseType((int)HttpStatusCode.BadRequest)]
    public async Task<IActionResult> CreateCategory([FromBody] CategoryCommandDto createCategoryCommandDto)
    {
          //some code
    }
}

Проблема в том, что теперь мы добавили версии API и выбрали версию по маршруту.

Итак, теперь конечная точка /category выглядит как /v1/category, и мы скоро создадим /v2/category.

Есть ли способ настроить refit (через атрибуты или подобное), чтобы он мог понять мои версионные маршруты?

Я хочу избежать необходимости писать новый клиент для каждой новой версии API и включать версию в маршрут конечной точки, например

ICategoryApiV1.cs

[Post("/v1/category")]
Task CreateCategoryAsync([Body] CategoryCommandDto createCategoryCommandDto);

Представьте, что клиент больше и имеет много методов, а не только один. Также не все методы могут меняться между версиями.

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете достичь этого другим способом: 1) Использовать как аргумент метода;

ICategoryApiV1.cs

[Post("/{v}/category")]
Task CreateCategoryAsync([Body] CategoryCommandDto createCategoryCommandDto, [AliasAs("v")]int version = 1);

2) Определить свойство внутри CategoryCommandDto;

public class CategoryCommandDto
{
    // Properties can be read-only and [AliasAs] isn't required
    public int v { get { return 1; } }
      .....
}

3) Определите baseUrl для httpClient во время ICategoryApi создания

services.AddRefitClient<ICategoryApi>()
    .ConfigureHttpClient(c => c.BaseAddress = new Uri($"https://api.example.com/{version}"));

4) Или, если вам нужны более сложные вычисления, вы можете добавить собственный HttpHandler и настроить его в своем клиенте.

services.AddRefitClient<ICategoryApi>(settings)
        .ConfigureHttpClient(c => c.BaseAddress = new Uri("https://api.example.com"));
        .AddHttpMessageHandler<VersionHandler>()
...