“/ users”和“/ users /”是否应指向相同(RESTful)资源?

时间:2013-07-30 13:18:24

标签: http rest

他们在this以及其他任何网站都可以,但我不确定我理解为什么。

一个流行的类比将RESTful资源与文件系统中的文件进行比较,文件名users不会指向与文件名users/ 静态网页相同的对象。静态网站users会指向users.htmlusers/ - 指向其他文件 - users/index.html

4 个答案:

答案 0 :(得分:2)

  

filename users不会指向与文件名users/相同的对象。

事实并非如此。在大多数文件系统中,您不能在同一父目录中拥有名为users的文件和名为users的目录。

cd userscd users/的结果相同。

答案 1 :(得分:2)

简短回答:如果重定向到另一个,他们可能只识别相同的资源。

URI识别资源,但它们与HTTP中的GET请求的区别depending on the response status code。如果将3xx返回给另一个,则两个URI标识相同的资源。如果两个资源都返回2xx代码,则URI标识不同的资源。他们可能会在回复GET请求时返回相同的响应,但它们不是相同的资源。这两个资源甚至可以映射到相同的处理程序以生成它们的回复,但它们因此不是相同的资源。致quote Roy Fielding

  

资源不是存储对象。资源不是   服务器用于处理存储对象的机制。该   resource是概念映射 - 服务器接收标识符   (标识映射)并将其应用于其当前映射   实现(通常是特定于集合的深树的组合   遍历和/或哈希表)来查找当前负责的   处理程序实现和处理程序实现然后选择   基于请求内容的适当行动+响应。

那么,/users/users/是否应该返回相同的响应?不。如果一个人没有重定向到另一个,那么他们应该返回不同的回答。但是,这本身并不是REST的约束。然而,这是一个约束,它使网络系统更具可扩展性:在多个资源中复制的信息可能会失去同步(特别是在存在缓存的情况下, 是REST的约束)和引导竞争条件。请参阅Pat Helland的Apostate's Opinion以获得完整的讨论。

最后,客户端在尝试解析相对于给定URI的引用时可能会中断。 URI spec清楚地表明,针对Jerry/age解析相对引用/users/会导致/users/Jerry/age,而针对/users解析它(没有尾随斜杠)会导致{ {1}}。令人惊讶的是,已经编写了多少客户端代码来检测并纠正后者,使其表现得像前者(并不总是成功)。

对于任何集合(/Jerry/age经常是这样),我发现最好始终在URI中发出/users/,每次都将/users/重定向到/users,并提供服务来自/users/资源的最终响应:这可以防止实体失去同步,并在任何客户端上轻松实现相对分辨率。

答案 2 :(得分:1)

这有一些细微差别,而“用户”代表一种资源,而“用户/”应代表一组资源,或对所有资源“用户”的操作......但似乎没有“标准” “对于这个问题。

还有另外一个讨论,请看一下:https://softwareengineering.stackexchange.com/questions/186959/trailing-slash-in-restful-api

答案 3 :(得分:0)

从技术上讲,它们并不相同。但是/users的请求可能会导致重定向到/users/,这使得它们在语义上相等。

就JAX-RS @Path而言,它们都可以用于相同的路径。