如何用单一路由模式区分处理电影控制器的两类Get请求?
ASP.NET Core 路由区分Guid与普通字符串的实现方案
核心思路就是利用ASP.NET Core的路由约束,给两个请求的路由参数指定明确的类型规则,框架会自动匹配符合格式的请求,不用手动做字符串转Guid的判断。
具体实现步骤
- 针对根据Guid获取电影的接口(Get /movies/{movieId}),在路由上给参数加上
guid类型约束,同时方法参数声明为Guid类型 - 针对根据类型获取电影的接口(Get /movies/{genre}),直接用普通字符串参数的路由即可,框架会在匹配不到带Guid约束的路由时,自动命中这个接口
控制器代码示例
[ApiController] public class MoviesController : ControllerBase { // 匹配/movies/后跟Guid格式字符串的请求,比如/movies/bff4c605-7ae4-4676-bcf8-12345f621bfd [HttpGet("movies/{movieId:guid}")] public IActionResult GetMovieById(Guid movieId) { // 这里写根据ID查询电影的业务逻辑 return Ok($"查询ID为 {movieId} 的电影"); } // 匹配/movies/后跟普通字符串的请求,比如/movies/Action、/movies/Comedy [HttpGet("movies/{genre}")] public IActionResult GetMoviesByGenre(string genre) { // 这里写根据类型查询电影的业务逻辑 return Ok($"查询类型为 {genre} 的电影"); } }
注意事项
- 路由匹配优先级:带明确类型约束的路由优先级更高,所以只要URL的第二段符合Guid格式,就一定会命中
GetMovieById方法,不会被误分到类型查询接口 - 如果担心极端情况(比如某个类型名称刚好是合法Guid格式),可以考虑调整类型查询接口的路由结构,比如改成
[HttpGet("movies/genre/{genre}")],彻底区分两个接口的路径,避免冲突
内容的提问来源于stack exchange,提问作者user22155685
相关产品推荐
相关产品推荐

