2012-09-21 63 views
5

大多数REST的教程安排资源如下:设计REST风格的URL的网页

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

但构建Web应用程序在浏览器中使用时,存在很少讨论,然后才能发布到缺失的环节/汽车/,你需要获得一个表格来创建一个新的资源(汽车)。这个表单的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,因为“新”实际上用作动词而不是资源,但表单应该在哪里,因为GET /car/已用于列出汽车,因此您不能使用GET /car/新车的形式。

总之,我的问题是:“创建资源表单的RESTful URL是什么?”

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

+0

不能满足这个足够!在任何地方都没有提到这个缺失的链接,可悲的是也没有令人满意的答案。 – aefxx

回答

2

REST不会太在意你的URI的样子,只要确定一个独特的资源,而且是自描述。符合这些标准,除此之外,这是个人偏好。没有任何东西禁止在URI中使用动词,如果它使用一个动词是有意义的。

关于您稍有相关的笔记,您在表格作为模式时所暗示的是媒体类型。 RESTful架构涉及客户端和服务器都理解用于表示应用程序状态的媒体类型。

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

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

也就是说从罗伊菲尔丁,谁定义REST的人。一般来说,你的媒体类型应该是可扩展的 - 也就是说,除非必要,否则任何更改都应该添加并且不会破坏较旧的客户端。

+0

我想我想要的是其他人如何在其REST式URL中解决此问题(需要GET创建表单)的示例。我使用的另一种方法是将创建表单放在/ car /页面上(这将非常完美的RESTful),但是从可用性角度来看,例如,如果/ car /页面已经太拥挤,这并不总是合适的。 –

+2

如果你定义了一个'/ cars /:id'的路线,并且你试图让你的表单位于'/ cars/new'之类的地方,那么你就不能拥有一个id为'new'的汽车 - 谨慎的。也许你可以有像'/ forms/add-new-car'这样的东西。 – tuespetre

2

我一直认为“form”本身不是资源,所以/<name>/new没问题 - 表单不是API的常用元素。幻灯片的作者将其列入“不良”名单,但没有提供正确的名单 - 我认为他是如此RESTful,他忘了考虑这种情况。

+0

问题是'/ /new /'暗示'/ /new /'是一个子资源'/ /',而不是'/ /new /'实际上是对'/ /' –

+1

我同意,但仍然 - 您提供了答案,为什么它不好(我已经知道),而不是正确的答案或其他建议。你能给我们提出新的想法吗? –