如何区分查询参数和路径参数

7

我希望我的api有两个GET方法,一个是通过路径参数访问的Route:

api/people/{personId}

另一个是通过查询参数访问的Route:

api/people?text=something

但如果我放入以下代码:

// GET: api/people/{personId}
[Route("api/people/{personId}")]
[HttpGet]
public HttpResponseMessage Get(long personId)
{
}

// GET: api/people?text=something
[Route("api/people")]
[HttpGet]
public HttpResponseMessage Get(string text)
{
}

然后尝试打开/api/people/1,提示格式错误。当我尝试打开/api/people?text=something时,它可以正常工作。

我只定义了默认路由:

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

我该如何让它们都起作用?定义一下,如果是路径参数就去第一个,如果是查询参数就去第二个?


当你把 long 改成 int 会发生什么?(出于好奇)。虽然是个好问题,但我还不确定答案。从这段代码看,我认为应该不会有任何问题。 - user1017882
我已经使用Web API 2.2测试了这个确切的场景,它可以正常工作。我认为你正在使用旧版本的Web API。 - huysentruitw
@JayMee 无论是 long 还是 int,结果都是一样的。 - Vítor Martins
@WouterHuysentruit 我正在使用Microsoft Visual Studio Ultimate 2013和Web API 2.2,但它无法正常工作。 - Vítor Martins
正如B先生在他的回答中所说的,我也没有包含手动路由,也许这就是问题所在? - huysentruitw
1个回答

4
我刚刚在使用Web API 2的Visual Studio 2015中添加了这个,它可以正常工作。 我确实需要添加以下行(每个控制器方法都需要添加一行)。
return Request.CreateResponse(HttpStatusCode.OK);

我还清除了默认路由配置。以下URL可以正常工作:

http://localhost:64377/api/people/1

http://localhost:64377/api/people?text=Hello

当我在IE中输入这些URL时,我会调用控制器中的两个相应方法。

这好像有效了,我猜问题可能是默认路由配置,谢谢老兄! ;) - Vítor Martins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接