REST API设计-通过加载ID创建资源

3

我的REST服务需要支持加载/重新加载资源而不是直接创建它。

目前的API:

GET /books
GET /books/12345
DELETE /books/12345

一本书看起来像这样:

{"id": 12345, "title": "three little bears", "author": ...}

目前还不清楚是否

Request:  PUT /books/12345
Response: HTTP 204 No Content

或者

Request:  POST /books
Payload:  {"id": 12345}
Response: HTTP 201 Created, Location: /books/12345

"加载"或"重新加载"书本的更好方法是:

详细说明: "加载"或"重新加载"将查询数据库以通过id检索图书,并将结果放置在持久缓存中。对于GET请求,会使用缓存进行查询。图书的属性可能会在数据库中更改,这意味着"加载"或"重新加载"不是幂等操作。只有管理员才能使用load / reload和delete操作。

我认为正确的方法是使用POST,因为PUT应该是幂等的。但是,使用POST似乎很奇怪,因为针对id = 12345的/book的多个POST仅会创建单个资源(尽管会多次重新创建)。

我考虑了以下其他选项,但它们似乎更加过分:

* POST /books/12345/load
* POST /books/load, with payload {"id": 12345}
* POST /load/book, with payload {"id": 12345}

你认为如何?

更进一步地,我想提供一个异步的加载/重新加载操作,但我不想创建一个用户可以跟踪的操作/作业资源,我只想要一个即插即用的快速操作。

例如:对于书籍12345,异步加载/重新加载到缓存中。我只需要服务响应HTTP 202 Accepted就足够了。无需询问加载/重新加载的进度。

简而言之:我正在构建一个REST服务来管理图书缓存。加载/重新加载和删除操作仅能由管理员执行,而GET请求则对所有人开放。加载/重新加载操作应从数据库中加载/重新加载记录。

2个回答

0

我认为你不应该在资源路径中使用动作名称(例如/books/12345/reload),因为这并不是真正的RESTful。话虽如此,我同意你使用方法POST是正确的。

在我看来,你应该在资源路径/books/12345上使用方法POST。它将对应于一个加载/重新加载操作,并且可以是异步的,即返回状态码202。如果你已经为此资源使用了POST方法,则应考虑使用本博客文章中描述的策略:https://templth.wordpress.com/2015/03/20/handling-multiple-actions-for-a-post-method/

希望能帮到你, Thierry


0

如果我理解正确,您有一个

  • 起源
  • 数据库
  • 客户端

如果客户端GET了一本书,他从数据库中获取资源。数据库不知道这本书是否在此期间被更改,它会提供过时的版本吗?因此,您希望客户端POSTPUT资源以强制数据库再次从起源获取条目?

请考虑以下内容:

起源缓存其内容,数据库缓存其内容,客户端也缓存。

如果用户按F5,客户端将重新加载资源,对吗?这是好行为吗?不是。客户端是否检查资源是否过时并仅在必要时获取才更好?是的。这可以通过发送HTTP-HEAD来实现,请求服务器上次修改的日期,如果客户端检索日期较旧,则需要再次获取,否则可以从缓存中提供。

对于数据库/源星座也是同样的情况。数据库需要验证其内容是否仍然是请求的最新内容,然后提供服务或从源获取它,更新缓存并提供新条目。

因此,客户端仍将GET资源,如果他不想以任何方式更改资源,则这将是准确的。


我已更新描述使其更加清晰。简而言之:我正在构建一个REST服务,用于前置一本书的缓存。加载/重新加载和删除操作只能由管理员执行,而GET对所有人开放。加载/重新加载操作应该从原始数据库加载/重新加载记录并将其放入缓存中。注意:同意HEAD是一个有用的补充。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接