WebAPI如何处理嵌套资源?

时间:2015-06-11 15:47:24

标签: .net rest asp.net-web-api

我正在寻找有关使用WebAPI 2的最佳实践的建议和建议:

假设我有两个控制器(用户和书籍),并且希望接受这些路线:

/users/{user_id}/books <= books owned by user_id

/books <= all books
/books/{book_id} <= book from id

具体处理/ users / {user_id} / books的最佳做法是什么?我在REST API中处理了很多自定义路由,所以我在方法上使用[RoutePrefix]和[Verb,Route]。

提前多多感谢!我一直在努力为常见情况找到更好的解决方案和做法。

1 个答案:

答案 0 :(得分:2)

我喜欢将返回实体的所有路由放在同一个控制器上。所以BooksController看起来像这样:

public sealed class BooksController : ApiController
{
    //Ideally this Repository would be a dependency injected object
    private readonly IRepository<Book> _repo = new BooksRepo(); 

    [Route("books")]
    [HttpGet]
    public IQueryable<Book> GetAll()
    {
        return _repo.GetAll();
    }

    [Route("books/{bookId:int}")]
    [HttpGet]
    public Book GetById(int bookId)
    {
        return _repo.GetById(bookId);
    }

    [Route("users/{userId:int}/books")]
    [HttpGet]
    public IQueryable<Book> GetBooksByUser(int userId)
    {
        return _repo.GetByUser(userId);
    }

    [Route("users/{userId:int}/books/{bookId:int}")]
    [HttpGet]
    public Book GetUsersBook(int userId, int bookId)
    {
        return _repo.GetByUser(userId).FirstOrDefault(book => book.Id == bookId);
    }
}

现在任何返回Books的路由都应该在此控制器上。返回Users的任何路由都将放在UsersController上。这有助于我们保持组织和简化,因为Route属性可以放置在任何控制器上,您可以非常轻松地在任何控制器上定义任何路径,这使得难以跟踪所有可能的路线。