在同一个web api控制器中,可以有两个具有不同参数类型的GET方法吗
本文关键字:两个 参数 类型 方法 GET 控制器 api web 同一个 | 更新日期: 2023-09-27 18:26:48
我有一个asp.net web api控制器,里面有两个GET方法。一个接受字符串参数,另一个接受int参数。我只有一个默认的路由,它是用web api设置的。
public HttpResponseMessage GetSearchResults(string searchTerm)
{
HttpResponseMessage response;
//Do Work
return response;
}
public HttpResponseMessage Get(int id)
{
HttpResponseMessage response;
//Do Work
return response;
}
每次在URL中传递int值时,都会调用获取字符串参数的GET方法。从不调用接受int参数的GET方法。
在同一个控制器内是否可以有两个具有不同参数类型的GET方法?
-编辑-建议的重复问题不同,因为它询问了两个具有完全相同参数类型的方法——我询问的是不同的参数类型。
是的,这是可能的。默认配置的开箱即用,假设您将searchTerm
作为查询字符串参数传递,那么您所拥有的应该可以工作。但是,如果您试图将其作为URL的一部分进行传递,例如/api/myurl/blah
,则默认约定路由将尝试将其与方法的int
版本相匹配,并返回错误。您必须编辑默认配置或使用"属性路由"。
一般来说,我发现基于约定的MVC路由在WebApi中用处不大,所以我通常会禁用它并使用属性路由。
要启用属性路由,请添加
config.MapHttpAttributeRoutes();
到您的WebApi配置。
然后你可以将你的方法标记为
[HttpGet]
[Route("api/myobject/")]
public HttpResponseMessage GetSearchResults(string searchTerm)
{
HttpResponseMessage response;
//Do Work
return response;
}
[HttpGet]
[Route("api/myobject/{id:int}")]
public HttpResponseMessage Get(int id)
{
HttpResponseMessage response;
//Do Work
return response;
}
现在,您可以通过调用第一个方法
/api/myobject?searchTerm=blah
第二个通过
/api/myobject/1
它们不应该碰撞。
但是,如果您希望searchTerm
位于URL中而不是查询参数中,则可以将路由更改为
[Route("api/myobject/{searchTerm}")]
api/myobject/{id:int}
路由将捕获所有id,而api/myobject/{searchTerm}
将捕获大多数其他id。然而,要小心这一点,因为如果URL不是URL编码的,就会发生奇怪的事情。
我不知道你到底在寻找什么URL格式,所以我提供的只是简单的例子。我之前发布的链接深入探讨了属性路由。它允许您创建比WebApi从MVC继承的约定路由更复杂的路由。