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
诡异之处:
POST    /api/object/id/archive  move object to archive (makes some REST sense)
POST    /api/object/id          move object from archive (muddy)
存档:
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
或者,也许是存档 URL 的这些 mod 之一:
GET     /api/object/archive/id  get archive object
GET     /api/objectarchive/id   get archive object
对于将对象移入和移出存档,上述内容感觉非常混乱(不是很自我记录)。它还导致一些 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.
诚然,这与我之前将存档视为单独的对象存储库的说法大相径庭。然而,这个思考过程最终导致了这种设计上的妥协。这在大多数方面对我来说都很好。
我个人不同意将查询字符串用于任何用途,但...呃...查询。所以,我不。数据更改的有效负载——无论多小——都应该放在正文中(当它不适合 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
要不就
POST /archive?target=http://example.org/foo/33
201 Created
Location: http://example.org/archive/foo/33
| 归档时间: | 
 | 
| 查看次数: | 1174 次 | 
| 最近记录: |