/users/{username}
是/users/{userId}
的别名(没有另一个就不能存在),那么我希望删除前者意味着您要删除后者。 /lists/{listId}/users/{userId}
是引用到/users/{userId}
(一个可以不存在另一个),那么我希望能够删除引用而不影响规范资源HTTP GET
都会导致HTTP 303到规范资源。我认为两种类型对HTTP GET
的行为相同而对HTTP DELETE
的行为相同是令人困惑的。
这引出了以下问题:
HTTP DELETE
时会发生什么?答案 0 :(得分:0)
DELETE方法请求源服务器删除目标 资源。这种方法可以被人为干预(或 原始服务器上的其他方法)。客户无法保证 操作已经执行,即使状态代码 从原始服务器返回表明该操作已经执行 顺利完成。但是,服务器不应该指示 成功,除非在作出答复时,它打算这样做 删除资源或将其移动到无法访问的位置。
<强>&GT;如果响应包括a,则成功的响应应该是200(OK) 描述状态的表示,202(已接受),如果操作有 尚未颁布,或204(无内容)如果已采取行动 已颁布,但回复不包括代表。
所以:
如果/ users / {username}是/ users / {userId}的别名(没有其他人就不能存在) 那么&gt;我希望删除前者意味着您要删除后者
在别名上调用HTTP DELETE时会发生什么?
必须删除“两个”资源。据我了解,如果没有其他人不能存在,他们只是同一资源的不同标识符,所以在删除其中一个后,请求必须回答404 Not Found for both。
从列表中删除引用而不删除它们指向的实际对象的适当方法是什么?
<强>更新强>
我的问题是应该使用哪些HTTP方法来表明客户端想要从列表中删除引用?
如果用户(客户端?)希望在不删除实际资源的情况下从列表中删除引用,则只有一种方法 - 客户端必须向服务器发送带有修改列表的PUT请求,这意味着必须用新的列表替换现有列表。如果用户没有足够的权限,则可以返回“403 Forbidden”作为回应。
要执行与此相反的操作(即在列表更改时通知用户)如果资源(即本例中的列表)应该在客户端缓存并且删除某些其他资源会影响此列表,那么只有我能想到的方法“通知”用户是使用缓存。例如:
请求强>
GET /list HTTP/1.1
Host: service.org
<强> RESPONSE 强>
HTTP/1.1 200 OK
Content-Type: application/...
Content-Length: ...
Cache-Control: private, max-age=0
ETag: a32lasdf
在上面的响应中,Cache-Control标头值“private,max-age = 0”是客户端的指令,它可以在本地缓存表示,但每次都必须向服务器发送以下请求:
请求强>
GET /list HTTP/1.1
Host: service.org
If-None-Match: a32lasdf
如果/ list资源未被触及,那么ETag值将匹配“If-None-Match”值,服务器可以响应“304 Not Modified”并且客户端不需要做任何事情。但是如果先前的删除操作影响/ list,则ETag的哈希代码将与提供“If-None-Match”头的哈希代码不同,因此服务器将返回/ list资源的新表示。
答案 1 :(得分:0)
URI是对资源的引用,而不是资源本身。从某种意义上说,它们都是规范的。不同的URI可以标识相同的资源。他们也可能是尚未存在的东西。 “一个不能没有另一个”的概念是应用程序特有的东西,它不是REST约束。理想情况下,您不会相互依赖URI。如果删除资源,则指向它的所有URI都将指向任何内容。或者至少,如果URI指向资源而不是彼此指向的话应该如何。
<强>更新强>
根据RFC2396:
1.1 URI概述:
...
资源
资源可以是具有身份的任何资源。熟 示例包括电子文档,图像,服务 (例如,“今天洛杉矶的天气预报”)和a 收集其他资源。并非所有资源都是网络 “检索”;例如,人类,公司和约束 图书馆中的书籍也可以被视为资源。
资源是实体或集合的概念映射 实体,不一定是与之对应的实体 在任何特定时刻映射。因此,一种资源 即使它的内容---实体也可以保持不变 它目前对应的---随时间变化,提供 概念映射在过程中没有改变。
标识符
标识符是可以作为参考的对象 具有身份的东西。在URI的情况下,对象是 一系列具有有限语法的字符。
<强>更新强>
我想,如果资源可通过多个URI访问/修改,则由应用程序指定一个规范的(将包含在响应的超文本中的URI)。但是,是的,这是非规范的URI(从应用程序的角度来看),而不是资源。