我有一个 ASP.NET Core Minimal API。我想使用请求标头
X-Api-Version
对端点进行版本控制。根据版本我想做不同的事情。
类似这样的:
app.MapPost("/save", (
[FromHeader(Name = "X-Api-Version")] SaveVersion version, // how to constraint this to v1?
[FromBody] SaveRequestV1 request
) => "Do something");
app.MapPost("/save", ( // this is considered duplicate route
[FromHeader(Name = "X-Api-Version")] SaveVersion version,
[FromBody] SaveRequestV2 request
) => "Do another thing");
public enum SaveVersion
{
v1 = 1,
v2
};
public class SaveRequestV1
{
public string Name { get; set; }
public bool IsMember { get; set; }
}
public class SaveRequestV2
{
public string Name { get; set; }
public int MemberStatus { get; set; }
}
是否可以根据请求标头有不同的路由处理程序?
我希望我能做到
[FromHeader(Name = "X-Api-Version:regex(^1$)")]
类似于 url 中的路由约束,但无法识别。
Swagger 可以通过请求标头理解此版本控制吗?
虽然您可以使用 ASP.NET API Versioning 包来处理版本控制要求,但 Swagger 不会喜欢您有两个具有相同方法/路径的端点。
操作的冲突方法/路径组合“POST 保存” - HTTP:POST 索引,HTTP:POST 索引。 Swagger/OpenAPI 3.0 的操作需要独特的方法/路径组合
这不会阻止端点工作,但会阻止 Swagger 加载并显示
Failed to load API definition - 500
错误。通过配置 Swagger 选项可以忽略冲突,但只有一个端点可见。
如果您在 URL 中提供版本作为路径的一部分或查询字符串参数,则可以避免冲突,这也是 Microsoft 推荐的方法。