" GetBy" Web API中的方法

时间:2017-10-11 14:21:44

标签: c# rest asp.net-web-api asp.net-core

我们正在使用.NET Core构建Web API。我们需要支持" GetBy"功能,例如GetByName,GetByType等等,但我们遇到的问题是如何通过Restful方式的路由来描述这个问题,以及方法重载不正确地处理我们认为路由应该如何。我们正在使用MongoDB,因此我们的ID是字符串。

我假设我们的路线应该是这样的:

/api/templates?id=1
/api/templates?name=ScienceProject
/api/templates?type=Project

问题是我们控制器中的所有方法都有一个字符串参数,并且没有正确映射。我的路线是不同的还是有办法将这些路线正确映射到正确的方法?

2 个答案:

答案 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);
    }
}