RESTful设计具有二进制状态的资源

时间:2011-12-28 18:52:29

标签: rest

我有一个资源本质上是一个简单的CRUD文档,它有一个小的转折,因为它可以被切换"进入"同步"陈述在哪里而不是使用它自己的当前值它现在返回一个"父"的值。现在与它同步的文件。

我正在尝试找到一种RESTful方法来对此进行建模。该资源有一个属性,指示此状态Synchronzied = true/falseParentId属性,以指示与之同步的资源。

一个选项是允许在PUT更新期间更改此内容,但感觉有些不正确,因为这不是文档的一部分,但在某些方面是关于文档的元数据。我还考虑了POST /document/{id}/synchronized请求,其中请求的状态作为参数传递。

虽然感觉不是很合适。第一个感觉有点尴尬,因为感觉好像我只是为一个值解析提交的数据,如果我们正在同步,其余的基本上被丢弃。在第二种情况下,仅为一个属性创建嵌套资源是错误的。

3 个答案:

答案 0 :(得分:1)

您可以考虑,在响应同步资源上的GET时,返回302/303,并将Location头设置为父资源。但是然后允许在同一个同步URI上使用PUT来替换与传输实体的重定向,然后在后续GET响应中返回该重定向。如果您希望允许客户端将实体切换回同步状态,则可以通过向子URI发送包含所需父级URI的请求主体来执行此操作。您甚至可以通过允许客户端POST任何URI来找到偶然的用例,而不仅仅是一小组已知父级的id。

GET /child
    200 OK
    {foo: bar}

POST /child
{parent: /some/other}
    200 OK

GET /child
    302/303
    Location: /some/other

PUT /child
{foo: baz}
    201 Created

GET /child
    200 OK
    {foo: baz}

答案 1 :(得分:1)

这里的一个解决方案是拥有两种不同的资源类型 - 完整文档和从属文档 - 以MIME类型区分。例如,当您只是链接到其他文档时,您可以为完整文档application/vnd.mysite.documentapplication/vnd.mysite.documentlink+json

制作奴隶文件:

PUT /document/1234
Content-Type: application/vnd.mysite.documentlink+json

{"parent": "/document/1"}

制作完整的文件:

PUT /document/1234
Content-Type: application/vnd.mysite.document

Hello, I am a document full of stuff.

然后,您可以通过将文档或303(请参阅其他)重定向返回到父级来响应GET个请求。

答案 2 :(得分:0)

您已查看过大多数常见选项,但请考虑使用HTTP PATCH method。我已经在Firefox和Chrome上通过AJAX成功使用了它。 PATCH方法指定要应用于文档的一组更改,而不是替换整个文档(通过PUT)。

(如果您只想检索文档的一部分,请考虑使用GET指定Range header。您需要定义除字节范围之外的其他内容才能处理使用XML或JSON文档 - 请参阅range units的详细信息。)

显然,这两个解决方案都假设一个愿意的客户端和服务器 - 如果你不能在请求的两端支持API,那么你也不会有太大的成功。