重新安装:版本化路线



我们在您的一个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( 像方法中的参数一样使用;

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( 在ICategoryApi创建期间为httpClient定义baseUrl

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

相关内容

  • 没有找到相关文章

最新更新