【发布时间】:2015-05-08 09:16:37
【问题描述】:
我的 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 请求所咨询的。这本书的属性可以在数据库中更改,这意味着“加载”/“重新加载”不是幂等的。只有管理员才能使用加载/重新加载和删除操作。
我相信正确的方法是 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}
想法?
为了使事情进一步复杂化,我还想提供一个异步加载/重新加载操作,但我不想创建用户可以跟踪的操作/作业资源,我只想要一个即发即弃.
示例:对于 Book 12345,异步加载/重新加载到缓存中。我只需要该服务以 HTTP 202 Accepted 进行响应,这就足够了。无需询问加载/重新加载的进度。
TL;DR:我正在构建一个 REST 服务来处理书籍缓存。加载/重新加载和删除操作只能由管理员执行,而 GET 对所有人开放。加载/重新加载操作应该从数据库加载/重新加载记录。
【问题讨论】:
标签: rest restful-url api-design