2013-01-10 78 views
1

设计API并寻找一些建议。REST风格的设计:区分取消发布和删除

这里的行动:

  • publish:发布文档(POST)
  • update:更新文档(PUT或PATCH)
  • unpublish:有把它的意图采取把文件(?)
  • delete:完全删除文档(DELETE)

有什么想法?

谢谢! 马特

回答

2
  • 更新和删除是非常明显的,因为你有他们。

  • 您认为“发布”与“创建”相同吗? “发布”可能意味着将您创建的文档公开并可见。一种想法是,你只能创建一次文档,但是你可以多次发布和取消发布。

您可能会考虑文档的生命周期以及在“取消发布”后可以使用它做什么。它的类型取决于你想要的序列:“创建(发布?)...取消发布...发布...取消发布...删除”来做。如果发布/取消发布不做任何与创建/删除不同的内容,那么您可以放弃它们并避免复杂性。

  • 的纯粹的REST的答案是提供在表示一个属性:{...“发表”:真...},让客户端PUT的更新改变这种状态。如果该状态发生变化,则会触发发布或取消发布文档所需的任何处理。

  • 但是,我在一个团队中感到不舒服,因为在公开和技术上可能对发布文档有很大的影响。因此,他们选择将操作视为POST“数据处理”请求(如HTTP规范所提供的)并提供POST URL以“发布”和“取消发布”文档。

  • 还有其他一些选择。就像使用POST作为附加动词一样,并提供一个“发布列表”URI,允许您将文档添加到发布列表中,执行任何所需的处理:

    POST ht_p://.../documents {文档}

    POST ht_p://.../published-documents {ID =}

    DELETE ht_p://.../published-documents/ {ID}

    DELETE ht_p ://.../documents/ {id}

编辑:打破了prentend URIs,因为stackoverflow抱怨。;)

+0

谢谢你的想法!我想避免区分已发布和未发布的文档。你有什么想法使用查询字符串来区分?像'DELETE /?action = unpublish'。取消发布可能不是一种常见模式。 – Matt

+0

哦,'create = publish'在这种情况下。 – Matt

+0

我可能不会称之为“动作”,只是因为你不应该在REST中这样做(HTTP动词应该表示你的动作)。但是您可以将它视为请求的修饰符,并将其称为“unpublish_only = true”或“permanent = false”或“erase = true”或其他。雅我知道那种听起来像是文字游戏......但是...... – Rob