代码之家  ›  专栏  ›  技术社区  ›  Rosstified

REST URL结构-资源的ID是否可以先于控制器?

  •  1
  • Rosstified  · 技术社区  · 16 年前

    ASP.NET MVC(和通常的MVC)的标准模板似乎是 控制器/动作/ID 但是,对于我目前正在进行的一个项目,我不确定这是否是一个合适的结构。例如,如果我有一个控制汽车的应用程序,那么对我来说,下面的结构更有意义:

      {car-rego}/{controller}/{action}/{data etc}
    

    这对我来说是有意义的,因为汽车(由登记牌标识)是我们正在执行操作的资源,功能的逻辑分离被分离到控制器和操作中。这将导致URL,例如:

    /ESX-121/Power/On
    /ESX-121/Speed/Set/100
    /ESX-121/Speed/Current -- get the current speed (could be /ESX-121/Speed also)
    /ESX-121/Turn/Left
    /ESX-121/Speed/Set/90
    /ESX-121/Power/Off
    

    如果遵循默认模式,则如下所示:

    /Power/On/ESX-121
    /Speed/Set/ESX-121/100
    /Speed/Current/ESX-121 -- get the current speed (could be /Speed/ESX-121 also)
    /Turn/Left/ESX-121
    /Speed/Set/ESX-121/90
    /Power/Off/ESX-121
    

    对我来说,第一个选项使它更加有意义,就可读的URL而言,资源标识符在一个固定的逻辑位置。例如 /速度/台/esx-121/100 在我看来,有一种类型速度的资源,其标识符是esx-121,但事实并非如此,操作是在汽车上进行的。

    对于这样的情况,如何构造URL以及相关的控制器和操作?您认为这是一个可接受的解决方案,还是有更好的方法来构建它?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Denis Troller    16 年前

    从“哲学”的角度来看,这是一个大问题。

    您似乎在使用GET请求来处理几乎所有的事情,比如设置速度。 REST背后的想法是,访问esx-121资源可以让您表示其当前状态,在您的情况下,它的速度、方向、是否打开等等。

    在其URL上发布汽车的一些表示将有效地改变其当前状态。(例如,如果使用XML表示,则可以发布

    <car><id>ESX-121</id><speed>100</speed><car>
    

    改变它的速度。在ASP.NET MVC下,您将为此发布一个表单。

    您要做的是将SOAP服务建模方法(面向操作或动词)应用于REST服务,这不是真正的想法。

    很难“得到”其余的方式来做事情,而且它可以违背您在使用SOAP服务时所做的一切,但是记住这些原则是很重要的。

    理论上,URL描述了一个资源,只有通过get(read)、post(create)、put(create或update)、delete(delete)执行可用的操作。

    编辑:感谢Marxidad更正了每个动词应该映射到的内容。

        2
  •  3
  •   Gideon    16 年前

    除了上面的评论之外,我认为稍微改变一下结构是完全可以的。(但不使用get更新上述数据)

    以CMS为例,您经常会看到以下结构:

    {controller}/{id}/{action}

    pages/about_the_company (显示操作是默认操作)
    pages/about_the_company/edit (get将显示编辑页,post将执行更新)

    当然,在CMS中,控制器默认为 pages 所以URL会更短。

        3
  •  1
  •   Vincent Robert    16 年前

    REST不是关于具有干净的URI,而是关于将正确的语义附加到HTTP方法GET、POST、PUT和DELETE。

    GET应该只用于安全的等幂运算,POST应该用于创建或处理,PUT应该用于更新现有资源,而DELETE应该用于(hmm)删除资源。

    你可以用很多的难看的URI?和&参数,如果需要,还可以开始RESTful。

    现在,关于您的uri,虽然第二个选项看起来很好,但它是一种使用非英语语言编写“纯英语”的方法。首先,这听起来可能是个好主意,但是让URI可读的主要思想是客户机可以使用它们并发现新特性。这就是为什么在URI中保留站点/应用程序的树结构总是一个更好的主意。

    Jacob Nielsen's Alertbox about URL as UI 有关此主题的详细信息。

        4
  •  0
  •   aehlke    15 年前

    如果您定义了任何类型的URI命名结构,比如“car rego/controller/action/data etc”,那么您的API就不是静止的。它只是一个简单的RPC。不能将URI或URI命名约定定义为RESTAPI的一部分—它直接违反了RESTful体系结构的约束之一。

    http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven 更多信息。