5

大多数 REST 教程将资源安排如下:

GET  /car/      -> list of cars
GET  /car/<id>/ -> info about specific car
POST /car/      -> create a new car

但是在构建用于浏览器的 Web 应用程序时,缺少一个很少讨论的链接,在您可以 POST 到 /car/ 之前,您需要获取一个用于创建新资源(汽车)的表单。此表单的 URL 应该是什么?

我通常使用:

 GET  /car/new/ -> form for creating a new car
 POST /car/new/ -> redirect to /car/<id>/ if item is created else show form with invalid fields highlighted

但根据http://www.slideshare.net/Wombert/phpjp-urls-rest这不是一个好的 REST URL。我可以看到为什么它不是一个好的 REST,因为“new”实际上是用作动词而不是资源,但是表格应该在哪里,因为GET /car/已经用于列出汽车,所以你不能GET /car/用于表格对于新车。

简而言之,我的问题是:“‘创建资源表单’的 RESTful URL 是什么?”

稍微相关一点,即使在 Web 服务中,有时依赖客户端提前知道模式并不总是明智的,因此即使在 Web 服务中,也可能需要一种方法让客户端请求资源的当前架构。AFAICS,这与需要获取创建表单的类似情况(即,表单有点像描述如何构造 POST 查询以创建资源的模式)。我的思路在这里正确吗?

4

2 回答 2

2

我一直认为“表单”本身不是资源,所以/<name>/new没关系——表单不是 API 的常见元素。幻灯片的作者把它放在了一个“坏”的名单上,但没有提供一个正确的名单——我认为他太 RESTful 以至于他忘记了考虑这种情况。

于 2012-09-22T00:05:50.653 回答
2

REST 不太关心您的 URI 的外观,只要它标识一个唯一资源并且是自描述的。满足这些标准,除此之外,这是个人喜好。如果使用一个动词是有意义的,没有什么禁止在 URI 中使用动词。

关于您稍微相关的注释,您暗示的形式是模式是media type。RESTful 架构涉及客户端和服务器都了解用于表示应用程序状态的媒体类型。

REST API 应该花费几乎所有的描述性工作来定义用于表示资源和驱动应用程序状态的媒体类型,或定义扩展关系名称和/或现有标准媒体类型的超文本启用标记。描述在感兴趣的 URI 上使用什么方法所花费的任何努力都应该完全在媒体类型的处理规则范围内定义(并且在大多数情况下,已经由现有媒体类型定义)。

在这里阅读更多:http ://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

那是来自定义 REST 的人 Roy Fielding。一般来说,您的媒体类型应该是可扩展的——也就是说,除非必要,否则任何更改都应该添加而不破坏旧客户端。

于 2012-09-22T06:51:27.390 回答