【问题标题】:Confused with REST and .Net Web Api - Should there be one GET per controller?对 REST 和 .Net Web Api 感到困惑 - 每个控制器应该有一个 GET 吗?
【发布时间】:2013-11-17 09:29:45
【问题描述】:

我对我的 RESTful 服务的设计感到非常困惑!

如果我使用 vanilla MVC3/4 执行此操作,那么我只需将操作方法​​标记为 [HTTPGet] 等,并且每个控制器可以有多个 Get。我这样我会按他们的“元组”来组织控制器。

我查看了 Web API MVC4 模板,它为我提供了从 Http GET 到 Getxxx() 方法的自动转换 - 但这意味着每个控制器只有一个 Get,并按对象而不是函数组织控制器。 .这似乎有些道理。

我看到很多关于添加命名路由的帖子 - 但这似乎打破了 Get、Post、Put、Delete 的自然模型。如果我这样做 - 那么我(本质上)不是回到香草 MVC4 吗?

  • 拥有大量控制器有什么影响吗?
  • 我在想吗 关于这个正确吗?

【问题讨论】:

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


    【解决方案1】:

    很快,

    拥有大量控制器有什么影响吗?

    没有

    我的想法正确吗?

    一般是的。

    默认 WebAPI/MVc 模板使用基于前缀和命名 GetXXX、PostXX 的路由。

    RouteTable.Routes.MapRoute(
         "WithActionApi",
         "api/{controller}/{action}/{id}"
     );
    

    但是您可以使用操作名称创建自己的自定义路由。然后你在你的操作方法的 URL 名称中使用,并且你已经编写了属性来设置 HTTP 动词,如 [HttpGet]

    RouteTable.Routes.MapRoute(
        "DefaultApi",
        "api/{controller}/{id}",
        new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
    );
    [ActionName("DefaultAction")] //Map Action and you can name your method with any text
    public string Get(int id)
    {
        return "object of id id";
    }        
    
    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }
    

    【讨论】:

    • 添加路由是否会以任何方式“破坏”REST 原则?每个对象有一个控制器是不是更好 - 还是没有“更好”的概念,只是“这有效,那么有效”?
    • 不,路由只是 ASP.NET MVC 使用的一种机制。你如何组织你的控制器和动作在 REST 中根本不关心。 REST 原则侧重于 URL。这可能会影响您组织控制器的方式。但是 REST 并不关心具体的业务场景。而且我确信对于您的具体业务场景,有多种方法可以组织 URL/控制器。只需选择适合您的方式,这样您的 WebAPI 服务和依赖的 Web 应用程序就会以良好的性能和清晰易懂的方式运行
    • 这里有一个链接,告诉您如何更好地使用 REST martinfowler.com/articles/richardsonMaturityModel.html,但无论如何实施取决于您和您的业务场景
    • 感谢@Regfor - 那篇文章给了我推动我当前项目从 WCF 迁移到 REST 的动力。
    • 最后的快问?是否有任何理由使用 WebAPI 模板而不是默认的 MVC4 模板?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2011-07-23
    • 2018-09-29
    相关资源
    最近更新 更多