REST:删除非规范资源

时间:2012-12-06 19:37:00

标签: rest

  • 如果/users/{username}/users/{userId}别名(没有另一个就不能存在),那么我希望删除前者意味着您要删除后者。
  • 如果/lists/{listId}/users/{userId}引用/users/{userId}(一个可以不存在另一个),那么我希望能够删除引用而不影响规范资源
  • 在这两种情况下,调用HTTP GET都会导致HTTP 303到规范资源。

我认为两种类型对HTTP GET的行为相同而对HTTP DELETE的行为相同是令人困惑的。

这引出了以下问题:

  1. 别名上调用HTTP DELETE时会发生什么?
  2. 从列表中删除引用而不删除它们指向的实际对象的适当方法是什么?

2 个答案:

答案 0 :(得分:0)

5.3.5. DELETE

  

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(从应用程序的角度来看),而不是资源。