【问题标题】:WebAPI how to deal with nested resources?WebAPI如何处理嵌套资源?
【发布时间】:2015-06-11 15:47:24
【问题描述】:

我正在寻找有关使用 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]。

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

【问题讨论】:

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


    【解决方案1】:

    我喜欢将返回实体的所有路由放在同一个控制器上。所以 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 的路由都应该在这个控制器上。任何返回用户的路由都将放置在用户控制器上。这有助于我们保持组织和简化,因为 Route 属性可以放置在任何控制器上,您可以非常轻松地在任何控制器上定义任何路由,从而难以追踪所有可能的路由。

    【讨论】:

    • 感谢您的回复,我最终做了这样的事情!
    • 这是一个不错的答案,但还有更好的答案 --> stackoverflow.com/questions/9594671/…
    • @AndreyMorozov “更好” 基于 OP。正如这个问题所述,有许多自定义路由和使用属性路由。您发布的答案是使用通用路由,并且每个映射路由都需要一个控制器。 WebApi 的一大优点是我们拥有的灵活性。更好是相对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多