SB2*_*055 9 rest web-applications asp.net-web-api single-page-application
我已经在我的WebAPI项目中非常安静地实现了CRUD功能.我现在正在尝试实现对象存档(不完全删除) - 如果只有ARCHIVEHTTP方法.
我看到两个选择:
1)具有isArchived每个可归档实体的属性,即使归档与请求无关,也必须包含在PUT和POST请求中.归档一个实体将是一个调用PUT /api/object/idisArchived设置为true的问题.看起来很笨重而且很安静.
2)拥有一个PUT /api/object/id/archive不需要身体的RPC-ish网址.似乎最有效但不安宁.
每个人在"通过api呼叫存档我的东西"空间中做了什么?
这是一个很好的问题,但我怀疑它最终可能会被标记为自以为是,因为我没有看到正确的答案......正如 OP 也指出的那样。
如果这对您的系统有意义,我建议将存档视为单独的对象存储(或什至是不同的对象类型)。对象设计不应依赖于数据库如何持久化您的数据。
因此,这是我现在能想到的最 RESTful设计(假设存档和更新总是分开的操作——它们应该是):
典型(这个大家都知道):
GET /api/object get all current objects
POST /api/object new current object
PUT /api/object/id update current object
DELETE /api/object/id delete current object
GET /api/object/id get current object
Run Code Online (Sandbox Code Playgroud)
诡异之处:
POST /api/object/id/archive move object to archive (makes some REST sense)
POST /api/object/id move object from archive (muddy)
Run Code Online (Sandbox Code Playgroud)
存档:
GET /api/object/archive get all archive objects
PUT /api/object/id/archive update archive object (if possible)
DELETE /api/object/id/archive delete archive object (tempting for unarchive)
GET /api/object/id/archive get archive object
Run Code Online (Sandbox Code Playgroud)
或者,也许是存档 URL 的这些 mod 之一:
GET /api/object/archive/id get archive object
GET /api/objectarchive/id get archive object
Run Code Online (Sandbox Code Playgroud)
对于将对象移入和移出存档,上述内容感觉非常混乱(不是很自我记录)。它还导致一些 REST API 设计难题,其中更新/删除/获取存档对象可能不需要特定于存档的功能。因此,我最终确定了这一点:
GET /api/object get all objects
GET /api/object?archived=false get all current objects
GET /api/object?archived=true get all archive objects
POST /api/object new current object, returns all current objects*
PUT /api/object/id update object (current or archived; cannot change archive state)
DELETE /api/object/id delete object (current or archived), returns objects of same archive state as deleted*
GET /api/object/id get object (current or archived)*
PUT /api/object/id/archive body:{archived:true} move object to archive, returns all current objects*
PUT /api/object/id/archive body:{archived:false} move object from archive, returns all archive objects*
* Return could be expanded/overridden with a query string if design calls for it.
Run Code Online (Sandbox Code Playgroud)
诚然,这与我之前将存档视为单独的对象存储库的说法大相径庭。然而,这个思考过程最终导致了这种设计上的妥协。这在大多数方面对我来说都很好。
我个人不同意将查询字符串用于任何用途,但...呃...查询。所以,我不。数据更改的有效负载——无论多小——都应该放在正文中(当它不适合 REST 动词和 URL 时)。
如果您总是归档特定资源并且从不删除它,我会将 DELETE 重新用于实际归档。如果你真的需要区分删除和存档,我要么做
GET /foo/33
200 OK
<foo id="33">blah</foo>
POST /archive
<foo id="33">blah</foo>
201 Created
Location: http://example.org/archive/foo/33
Run Code Online (Sandbox Code Playgroud)
要不就
POST /archive?target=http://example.org/foo/33
201 Created
Location: http://example.org/archive/foo/33
Run Code Online (Sandbox Code Playgroud)