为网页设计RESTful URL

时间:2012-09-21 23:54:03

标签: rest web-applications django-urls

大多数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/已经用于列出汽车,所以你可以' t使用GET /car/作为新车的表格。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

REST并不关心URI的外观,只要它识别一个唯一的资源并且是自我描述的。符合这些标准,除此之外,这是个人偏好。如果使用动词有意义,则禁止在URI中使用动词。

关于您的略微相关说明,您对表单作为架构的提示是媒体类型。 RESTful架构涉及客户端和服务器都理解用于表示应用程序状态的媒体类型。

  

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

在此处阅读更多内容:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

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