我们在您的一个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>()