Web API路由匹配查询参数

时间:2015-08-14 12:39:28

标签: asp.net asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我正在尝试使用Web API来处理以下请求...

请注意,?name=是搜索查询,而不是检索特定资源。所以也可以是?name=xyz&city=Atlanta或类似的东西。

GET http://localhost/api/customer?name=xyz

[Route("customer")]
public class CustomerController : ApiController
{
    [Route("{name:alpha}")]        
    public IHttpActionResult Get([FromUri]string name)
    {
        return Json(name);
    }
}

如果我从路由约束中删除:alpha,这似乎有效,否则我得到404.我需要能够约束查询参数(如果可能的话)。

或者,有没有更好的方法让Web API匹配带有查询字符串的路由?

3 个答案:

答案 0 :(得分:0)

为什么不使用

[Route("customer")]
public class CustomerController : ApiController
{
    [Route("{name/alpha}")]        
    public IHttpActionResult Get([FromUri]string name)
    {
        return Json(name);
    }
}

并将网址更改为:

GET http://localhost/api/customer/name/alpha

答案 1 :(得分:0)

从您的查询字符串中,您传递的是name的值,因此当您删除:alpha时,您的查询字符串与路径匹配并且有效。

将其更改为

[Route("customer")]
public class CustomerController : ApiController
{
    [Route("name/{alpha}")]        
    public IHttpActionResult Get([FromUri]string alpha)
    {
        return Json(alpha);
    }
}

然后会有效:

GET http://localhost/api/customer/name/xyz

OR

[Route("customer")]
public class CustomerController : ApiController
{
    [Route("{name}")]        
    public IHttpActionResult Get([FromUri]string name)
    {
        return Json(name);
    }
}

然后您不需要在网址中指定名称,您可以这样调用它:

GET http://localhost/api/customer/xyz

答案 2 :(得分:0)

您班级上方的标签应该是[RoutePrefix]而不是[Route]。 api路由的工作方式是/ api / RoutePrefix / Route?parameterName = XXXX。控制器的routeprefix是“customer”,路由是“name”(参数的名称),所以你想做:

/api/customer/name?name=XXXX

所以这样:

[RoutePrefix("api/customer")]
public class CustomerController : ApiController
{
    [Route("{name:alpha}")]        
    public IHttpActionResult Get([FromUri]string name)
    {
        return Json(name);
    }
}