我怎么能工作RESTFUL时添加多个获取行为与不同的输入PARAMS?(How can I add

2019-10-31 04:40发布

我试图找出最新最好的方法有多种Get的REST控制器动作。

我愿做这样的事情:

获取按ID:

public ResponseType Get(Guid id)
{
   // implementation
}

获得通过枚举类型:

public ResponseType Get(EnumType type)
{
   // implementation
}

获取其他枚举类型:

public ResponseType Get(OtherEnumType otherType)
{
   // implementation
}

等等..

现在,当我做这样的事情,我得到一个错误信息:

Multiple actions were found that match the request

我明白为什么我得到的消息,我的想法是如何做这样的事情(我想坚持REST)的最佳方式。

我知道我可以添加这样的路线:

routeTemplate: "api/{controller}/{action}/{id}"

但后来我需要改变动作的名称和网址 - 这似乎是一个解决办法,当我们谈论的休息。

我想另一件事是一个创建多个控制器Get -但似乎甚至wronger。

第三个解决办法是处理与输入参数一个获取动作,将有状态:

public ResponseType Get(ReqeustObj obj)
{
   switch(obj.RequestType)
   {
        case RequestType.GetById:
        // etc...
   }
}

无论如何,我想知道什么是最好的方式做在REST(的WebAPI)类似的东西。

Answer 1:

正如你现在,当网络API需要选择一个动作,如果你没有在路由指定动作的名称,它会查找其名称与方法的名称开始行动,GET在这种情况下。 所以你的情况,它会找到多种方法。

但它也尝试匹配的参数。 因此,如果包括参数的URL(路由参数)的一部分或查询字符串,动作选择将能够选择可用的方法之一。

如果不指定参数或指定的URL ID(甚至在查询字符串)应该调用第一超载。 如果您在查询字符串添加第二个动作的参数名称如下: ?type=VALUE ,应该选择相应的过载,等等。

现在的问题是,该参数的名称必须是不同的,否则将不能够选择的所有重载中的一个或另一个。

例如,如果你在浏览器中的注释使用的网址,你会看到如何选择正确的方法:

public class TestController : ApiController
{
    // GET api/Test
    public string Get()
    {
        return "without params";
    }

    // GET api/Test/5
    public string Get(int id)
    {
        return "id";
    }

    // GET api/Test?key=5
    public string Get(string key)
    {
        return "Key";
    }

    // GET api/Test?id2=5
    public string Get2(int id2)
    {
        return "id2";
    }
}

注意:您还可以使用路由约束来调用differet方法不使用查询字符串参数,但定义不同的约束条件不同的路线参数名称。 例如,你可以添加一个约束id只接受数字“\ d +”,然后它接受所有其他情况下的“钥匙”第二条途径。 通过这种方式,你能避免使用查询字符串



文章来源: How can I add multiple Get actions with different input params when working RESTFUL?