我试图找出最新最好的方法有多种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)类似的东西。
正如你现在,当网络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?