1

ASP.NET MVC(以及一般的 MVC)的标准模板似乎是{controller}/{action}/{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 而言,第一个选项更有意义,并且资源标识符位于一个恒定的逻辑位置。例如/Speed/Set/ESX-121/100向我建议有一个标识符为 ESX-121 的速度类型的资源,但事实并非如此,操作是在汽车上进行的。

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

4

4 回答 4

5

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

您似乎对几乎所有事情都使用 GET 请求,例如设置速度。REST 背后的想法是,对 ESX-121 资源的访问可以为您提供其当前状态的表示,在您的情况下,它的速度、方向、是否开启等。

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

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

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

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

可能很难“获得” REST 的做事方式,并且它可能与您在使用 SOAP 服务时所做的一切背道而驰,但牢记这些原则很重要。

从理论上讲,您的 URL 描述了一个资源,唯一可用的操作是通过 GET(读取)、POST(创建)、PUT(创建或更新)、DELETE(删除)进行。

编辑:感谢 marxidad 纠正我每个动词应该映射到的内容。

于 2009-03-30T03:25:01.090 回答
3

除了上面帖子中指出的评论之外,我认为稍微改变一下结构是完全可以的。(但不要使用 GET 来更新数据,如上所述)

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

{controller}/{id}/{action}

pages/about_the_company (显示操作是默认操作)
pages/about_the_company/edit(GET 将显示编辑页面,而 POST 将执行更新)

当然,在 CMS 中,控制器会默认设置为,pages因此 url 会更短。

于 2009-03-30T07:03:29.877 回答
1

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

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

如果需要,您可以使用带有大量“?和 &”参数的丑陋 URI,同时仍然可以开始 RESTful。

现在关于您的 URI,虽然第二个选项看起来不错,但它是一种使用非英语语言编写“普通英语”的方法。一开始这听起来可能是个好主意,但使 URI 具有可读性背后​​的主要思想是客户端可以使用它们并发现新功能。这就是为什么在 URI 中保留站点/应用程序的树结构总是一个更好的主意。

有关该主题的更多信息,请参阅Jacob Nielsen 的关于 URL 作为 UI 的警报框。

于 2009-03-30T07:21:26.963 回答
0

如果您定义任何类型的 URI 命名结构,例如“{car-rego}/{controller}/{action}/{data etc}”,那么您的 API 不是 REST。它只是 RPC。您不能将 URI 或 URI 命名约定定义为 REST API 的一部分——它直接违反了 RESTful 架构的约束之一。

有关详细信息,请参阅http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

于 2009-07-20T22:42:10.480 回答