我的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 }
);
答案 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