【问题标题】:Multiple PUT actions, asp.net mvc 4 web api多个 PUT 操作,asp.net mvc 4 web api
【发布时间】:2012-05-03 18:28:07
【问题描述】:

我正在尝试为此使用 asp.net mvc 4 构建一个 web api。假设我们有 Books 资源。获取,发布,删除工作正常,但万一发布我有点困惑。我想使用 PUT 的方式是 CQRS,例如:一个操作 PUT 用于更新标题,另一个操作 PUT 用于更新作者,另一个操作是使该书成为收藏夹。所有这些 PUT 操作都被不同类型的命令重载,它们只有一个参数。当我尝试从 MVC 向此资源路由发出 PUT 请求时失败,说明这是与请求匹配的多个 PUT 操作。有人可以建议如何配置路由来处理:

public HttpResponseMessage Put(MakeFavorite mf){/*code*/}

public HttpResponseMessage Put(ChangeTitle ct){/*code*/}

public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}

【问题讨论】:

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


    【解决方案1】:

    我认为最好不要在这里应用 RPC,即使是 David 的解决方案也有一些 RPC 工件。 首先你应该设计你的URI结构。例如:

    /books/{bookId}/favouritestate/{state}  
    /books/{bookId}/title/{title}  
    /books/{bookId}/author/{author}  
    

    然后更新你的路由表来处理这个:

       routes.MapHttpRoute(
                    name: "BookTitleApiRoute",
                    routeTemplate: "books/{bookId}/title/{title}  ",
                    defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
                    );
    

    然后添加一些控制器。例如:

     public class BookTitleController : ApiController
        {
            // GET /books/{bookId}/title/
            public HttpResponseMessage Get(string bookId)
            {
                return your book title
            }
            // PUT /books/{bookId}/title/{title}
            public HttpResponseMessage Put(string bookId,string title)
            {
                update book title and return result
            }
    
        }
    

    您还可以在诸如此类的对象之间进行交互。

    希望这将帮助 ypu 构建良好的 RESTful API =))

    【讨论】:

    • 对不起,迟到的评论...这适用于 Put,但是如果您有多个 Gets 或 Posts 来自同一个控制器呢?在同一个控制器中拥有多个帖子和获取信息是个好主意吗?
    • 您能否提供需要多个 Gets 或 Posts 的资源示例?至于 Get 你可以使用方法覆盖。
    • 还有一个针对部分更新的 PATCH 动词。 mnot.net/blog/2012/09/05/patch
    • RPC?这是什么意思?
    【解决方案2】:

    由于每个函数之间实际上并没有太大关系,因此您应该尝试将每个 put 方法放在单独的相应控制器中。

    public class MakeFavoriteController : ApiController
    {
        public HttpResponseMessage Put(MakeFavorite mf)
        {
            // Code
        }
    }
    
    public class ChangeTitleController : ApiController
    {
        public HttpResponseMessage Put(ChangeTitle ct)
        {
            // Code
        }
    }
    
    public class UpdateAuthorController : ApiController
    {
        public HttpResponseMessage Put(UpdateAuthor ua)
        {
            // Code
        }
    }
    

    【讨论】:

    • 我认为这些反对意见是针对您示例的 RPC 样式机制的。
    • 这是假设/暗示它们实际上不相关。您没有直接回答问题。
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 2013-02-23
    • 2020-05-19
    • 2012-09-03
    • 1970-01-01
    • 2012-03-30
    • 2022-01-02
    • 2014-10-17
    相关资源
    最近更新 更多