所有操作的web api单一自定义路由

时间:2016-06-01 12:52:09

标签: c# api asp.net-web-api routing url-routing

我的web api控制器中有五个动作,如下所示。

http://localhost:1234/products - 映射getallproduct行动
http://localhost:1234/products/1 - 映射getproductnyid行动
http://localhost:1234/products - saveproduct行动(帖子)
http://localhost:1234/products/1/getcolor - getproductcolorbyid行动
http://localhost:1234/products/1/getcost - getproductcostbyid行动

我需要只有一个自定义路由网址。

我尝试了以下路由,但它在url(http://localhost:24007/product/GetProductByID/Id)中添加了我不想要的操作名称。

config.Routes.MapHttpRoute(
    name: "ProductRoute",
    routeTemplate: "product/{action}/{productId}",
    defaults: new { controller = "Product", productId= RouteParameter.Optional }
);

1 个答案:

答案 0 :(得分:1)

如果您想要这种灵活性,则必须使用属性路由:

[RoutePrefix("products")]
public class ProductsController : ApiController {

    [HttpGet]
    [Route("")]
    public IHttpActionResult GetAllProduct()
    {
        //...
    }

    [HttpGet]
    [Route("{productId}")]
    public IHttpActionResult GetProductById(int id)
    {
        //...
    }

    [HttpPost]
    [Route("")]
    public IHttpActionResult SaveProduct(Product product)
    {
        //...
    }

    [HttpGet]
    [Route("{productId}/getcolor")]
    public IHttpActionResult GetProductColorById(int id)
    {
        //...
    }

    [HttpGet]
    [Route("{productId}/getcost")]
    public IHttpActionResult GetProductCostById(int id)
    {
        //...
    }
}

请记住在HttpConfiguration对象中注册它们:

config.MapHttpAttributeRoutes();

顺便说一下:如果你正在设计一个RESTful API(在我看来),我强烈建议你避免在你的URI中使用类似RPC的动作(例如,永远不要使用像getcolor这样的URI段,{{ 1}}),但使用符合REST约束的名称:

getcost

这可以通过更改http://localhost:1234/products/1/color http://localhost:1234/products/1/cost s:

来实现
RouteAttribute