我们正在使用.NET Core构建Web API。我们需要支持" GetBy"功能,例如GetByName,GetByType等等,但我们遇到的问题是如何通过Restful方式的路由来描述这个问题,以及方法重载不正确地处理我们认为路由应该如何。我们正在使用MongoDB,因此我们的ID是字符串。
我假设我们的路线应该是这样的:
/api/templates?id=1
/api/templates?name=ScienceProject
/api/templates?type=Project
问题是我们控制器中的所有方法都有一个字符串参数,并且没有正确映射。我的路线是不同的还是有办法将这些路线正确映射到正确的方法?
答案 0 :(得分:4)
如果参数是互斥的,即您只按名称或类型搜索,而不是按名称和类型搜索,那么您可以将参数作为路径的一部分而不是查询参数。
实施例
[Route("templates")]
public class TemplatesController : Controller
{
[HttpGet("byname/{name}")]
public IActionResult GetByName(string name)
{
return Ok("ByName");
}
[HttpGet("bytype/{type}")]
public IActionResult GetByType(string type)
{
return Ok("ByType");
}
}
此示例将导致以下路由:
/api/templates/byname/ScienceProject
/api/templates/bytype/Project
如果参数不相互排斥,那么您应该按照answer by Fabian H.
中的建议进行操作答案 1 :(得分:1)
您可以使用单个get方法创建TemplatesController,它可以获取所有参数。
[Route("api/templates")]
public class TemplatesController : Controller
{
[HttpGet]
public IActionResult Get(int? id = null, string name = null, string type = null)
{
// now handle you db stuff, you can check if your id, name, type is null and handle the query accordingly
return Ok(queryResult);
}
}