来源:懒得安分
链接:http://www.cnblogs.com/landeanfen/p/5501490.html
上面说了这么多都是路由的一些全局配置。并且存在问题:
如果http请求的方法相同(比如都是post请求),并且请求的参数也相同。这个时候似乎就有点不太好办了,这种情况在实际项目中还是比较多的。比如
public class OrderController : ApiController
{
//订单排产
[HttpPost]
public void OrderProduct([FromBody]string strPostData)
{
}
//订单取消
[HttpPost]
public void OrderCancel([FromBody]string strPostData)
{
}
//订单删除
[HttpPost]
public void OrderDelete([FromBody]string strPostData)
{
}
}
这个时候如果使用我们上面讲的Restful风格的路由是解决不了这个问题的。当然,有园友可能就说了,既然这样,我们在路由模板里面加上“{action}”不就搞定了么!这样确实可行。但还是那句话,不提倡。我们来看看如何使用特性路由解决这个问题。
如果要使用特性路由,首先在WebApiConfig.cs的Register方法里面必须先启用特性路由:
public static void Register(HttpConfiguration config)
{
// 启用Web API特性路由
config.MapHttpAttributeRoutes();
//1.默认路由
config.Routes.MapHttpRoute(
name: 'DefaultApi',
routeTemplate: 'api/{controller}/{id}',
defaults: new { id = RouteParameter.Optional }
);
}
一般情况下,当我们新建一个WebApi项目的时候,会自动在Register方法里面加上这句话。
我们在OrderController这个控制器里面加这个action
[Route('Order/SaveData')]
[HttpPost]
public HttpResponseMessage SavaData(ORDER order)
{
return Request.CreateResponse();
}
然后我们通过Web里面的Ajax调用
$(function () {
$.ajax({
type: 'post',
url: 'http://localhost:21528/Order/SaveData',
data: { ID: 2, NO:'aaa'},
success: function (data, status) {
alert(data);
}
});
});
得到结果:
当然,有人可能就有疑义了,这个特性路由的作用和“{action}”的作用一样嘛,其实不然,如果这里改成 [Route(“Test/AttrRoute”)] ,然后请求的url换成http://localhost:21528/Test/AttrRoute,一样能找到对应的action。
特性路由的目的是为了解决我们公共路由模板引擎解决不了的问题。一个action定义了特性路由之后,就能通过特性路由上面的路由规则找到。
特性路由的规则可以使用“{}”占位符动态传递参数,比如我们有这样一个特性路由
[Route('ordertype/{id}/order')]
[HttpGet]
public IHttpActionResult GetById(int id)
{
return Okstring>('Success' + id );
}
在浏览器里面调用
调用成功。到此,我们就能看懂本文最开始那个看似“怪异”的路由→/api/user/1/detail这个了。
[Route('api/order/{id:int=3}/ordertype')]
[HttpGet]
public IHttpActionResult GetById(int id)
{
return Okstring>('Success' + id );
}
这里约束可变部分{id}的取值必须是int类型。并且默认值是3.
看看效果
不满足约束条件,则直接返回404。
在正式项目中,同一个控制器的所有的action的所有特性路由标识一个相同的前缀,这种做法并非必须,但这样能够增加url的可读性。一般的做法是在控制器上面使用特性[RoutePrefix]来标识。
[RoutePrefix('api/order')]
public class OrderController : ApiController
{
[Route('')]
[HttpGet]
public IHttpActionResult GetAll()
{
return Okstring>('Success');
}
[Route('{id:int}')]
[HttpGet]
public IHttpActionResult GetById(int id)
{
return Okstring>('Success' + id );
}
[Route('postdata')]
[HttpPost]
public HttpResponseMessage PostData(int id)
{
return Request.CreateResponse();
}
}
那么这个这个控制器的action的时候,都需要/api/order开头,后面接上action特性路由的规则。
通过以上,我们就可以构造一个Restful风格的WebApi服务。
[RoutePrefix('api/AttrOrder')]
public class OrderController : ApiController
{
[Route('')]
[HttpGet]
public IHttpActionResult GetAll()
{
return Okstring>('Success');
}
[Route('{id:int=3}/OrderDetailById')]
[HttpGet]
public IHttpActionResult GetById(int id)
{
return Okstring>('Success' + id );
}
[Route('{no}/OrderDetailByNo')]
[HttpGet]
public IHttpActionResult GetByNO(string no)
{
return Okstring>('Success' + no);
}
[Route('{name}/OrderDetailByName')]
[HttpGet]
public IHttpActionResult GetByName(string name)
{
return Okstring>('Success' + name);
}
[Route('postdata')]
[HttpPost]
public HttpResponseMessage PostData(int id)
{
return Request.CreateResponse();
}
[Route('Test/AttrRoute')]
[HttpPost]
public HttpResponseMessage SavaData(ORDER order)
{
return Request.CreateResponse();
}
}
得到结果
整了这么久终于整完了。如果你觉得本文对你有帮助,请帮忙博主推荐,您的支持是博主最大的动力!
联系客服