他们在this以及其他任何网站都可以,但我不确定我理解为什么。
一个流行的类比将RESTful资源与文件系统中的文件进行比较,文件名静态网页相同的对象。静态网站users
不会指向与文件名users/
users
会指向users.html
和users/
- 指向其他文件 - users/index.html
。
答案 0 :(得分:2)
filename
users
不会指向与文件名users/
相同的对象。
事实并非如此。在大多数文件系统中,您不能在同一父目录中拥有名为users
的文件和名为users
的目录。
cd users
和cd 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
而言,它们都可以用于相同的路径。