4

我在我的机器上安装了新的 ASP .Net MVC4 beta 并且一直试图了解 Web API 的工作原理。我为单个集合(例如书籍)构建了一个演示。我按照 asp.net 网站上的示例进行操作。我实现了自己的发布到收藏的方法,即添加新书、获取所有书籍、获取特定书籍、更新书籍和删除书籍记录。这一切都很好。

前任:

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/a@a.com - get a particular author for a book
PUT /books/1/authors/a@a.com - update a particular author for a book
DLETE /books/1/authors/a@a.com - delete a particular author for a book

我很困惑如何添加路由以使此呼叫正常工作。默认情况下,我通过项目获得这条路线。

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

在这种模式下,为集合和它们之间的关联处理路由的正确方法是什么?

4

2 回答 2

2

在 Global 中管理路线可能会令人困惑且容易出错。就个人而言,我发现 Attribute Routing 包有助于大大简化路由配置。本文介绍了如何获取和使用它。

http://www.strathweb.com/2012/05/attribute-based-routing-in-asp-net-web-api/

于 2012-05-27T13:41:17.023 回答
0

我认为 Ken 使用 Attribute Routing 的方法更好,我是从这篇文章中发现的,我自己可能也会使用它。但这是我在了解 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!
于 2012-08-30T10:17:56.640 回答