假设我想实现一个用户API控制器。客户端需要通过整数ID获取用户,所以我创建了一个方法GET - /api/User/{id:int}
。
然后出于某种原因,我想实现通过用户名获取用户。最明显的解决方案是创建GET - /api/User/{name:string}
,但这种方法将与以前的方法相冲突。将方法命名为/api/UserByName/{name:string}
违反了REST实体规则。
如何在不违反REST规则的情况下处理此问题?
upd:我刚刚写了以下代码来创建多个路由:
[HttpGet]
public async Task<IActionResult> Get([FromQuery] int id)
{
return Ok();
}
[HttpGet]
public async Task<IActionResult> Get([FromQuery] string name)
{
return Ok();
}
swagger无法翻译此代码,并产生错误Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Conflicting method/path combination "GET WeatherForecast" for actions - WebApiSkeleton.API.Contro llers.WeatherForecastController.Get (WebApiSkeleton.API),WebApiSkeleton.API.Controllers.WeatherForecastController.Get (WebApiSkeleton.API). Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround
调用方法会引发另一个异常:Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches: WebApiSkeleton.API.Controllers.WeatherForecastController.Get (WebApiSkeleton.API) WebApiSkeleton.API.Controllers.WeatherForecastController.Get (WebApiSkeleton.API)
3条答案
按热度按时间shyt4zoc1#
我使用[FromQuery]的意思是。它要求你有一个带有id和name的类
然后有这样的路线
k5ifujac2#
ASP.NET核心路由在选择路由时使用优先级,通常从更特定到一般。因此,如果你有两条路由,一条带有{id:int},另一条没有任何限定符或:alpha限定符,那么如果你发送一个int,{id:int}就会被命中,否则,另一条更通用的路由也会被命中。这意味着这两条路线可以共存,并将做您想做的事情:
您可以测试使用postman或任何http客户端调用这两个enpoints。您遇到的错误可能与swagger无法生成文档有关,该文档如下所示:
Conflicting method/path combination
这与www.example.com的核心无关asp.net,而是趾高气扬。您可以忽略从swagger中获取{id:int}的那个,因为它不太通用。您可以用途:
[ApiExplorerSettings(IgnoreApi = true)]
一旦你这样做了,如果你打开swagger,你会看到一个单一的端点,但如果你尝试使用int,你会遇到{id:int}端点,否则你会遇到{id}端点。nkcskrwz3#
在此更新的示例中,GetData方法接受一个string类型的形参参数。它检查参数是否不为null或空。如果它不是空的,它会尝试使用int.TryParse()将其解析为整数。如果解析成功,它将参数视为ID,并执行逻辑以基于ID检索数据。如果解析失败,它将参数视为名称,并执行逻辑以基于名称检索数据。
样本终点:
按整数:
按字符串: