2012-05-21 39 views
4

我在我的计算机上安装了新的ASP.NET .Net MVC4测试版,并试图了解Web API的工作原理。我为单个集合构建了一个演示(例如书籍)。我跟着asp.net网站上的例子。我实现了自己的方法来张贴到一个集合,即添加一本新书,获取所有书籍,获取特定书籍,更新书籍和删除书目记录。所有这些工作正常。使用ASP处理Web API集合中的集合.NET MVC4

例:

POST /books - adds a new book 
GET /books - gets all books 
GET /books/1 - get a particular book 
PUT /books/1 - update a particular book 
DELETE /books/1 - delete a particular book 

现在我想添加的藏书里面另外一个集合,说作者和要实现相同的POST,PUT,GET和DELETE呼唤新的集合

我希望新的调用是这样的:

POST /books/1/authors - add a new author to a book 
GET /books/1/authors - gets all authors of a book 
GET /books/1/authors/[email protected] - get a particular author for a book 
PUT /books/1/authors/[email protected] - update a particular author for a book 
DLETE /books/1/authors/[email protected] - delete a particular author for a book 

我很困惑如何添加拨打这通电话的工作路线。默认情况下,我使用该项目获取此路线。

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

什么是正确的方式来处理路线在这种模式中的集合和它们之间的关联?

回答

0

我觉得Ken的使用属性路由是更好的方法,我只是发现它来自这个职位,而我自己很可能将使用为好。但是,在我了解AR之前,我想到了这一点。

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "JustController", 
      routeTemplate: "api/Books/{bookId}/{category}/{categoryId}/{subCategory}", 
      defaults: new 
      { 
       controller = "books", 
       bookId= RouteParameter.Optional, 
       category = RouteParameter.Optional, 
       categoryId = RouteParameter.Optional, 
       subCategory = RouteParameter.Optional 
      }, 
      constraints: new 
      { 
       bookId= @"\d*", 
       category= @"(|authors|pictures|videos)", 
       categoryId = @"\d*", 
       subCategory = @"(|comments)" 
      } 
     ); 

然后我想在Get,Post,Delete,Put函数的Request属性中使用URL,获取我需要的参数。

例如:

public class BooksController : ApiController 
    { 
     // GET api/books 
     public Book Get(int bookId) 
     { 
     var url = this.Request.RequestUri.ToString() // decide how to handle! 
+0

是的,我之前正在做这样的事情。就像你提到的基于属性的路由更清洁,更容易管理路由。谢谢。 – user1408865