在同一个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方法?

-编辑-建议的重复问题不同,因为它询问了两个具有完全相同参数类型的方法——我询问的是不同的参数类型。

在同一个web api控制器中,可以有两个具有不同参数类型的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继承的约定路由更复杂的路由。