通过REST更新结构化资源的最佳实践是什么?

5

我有一个客户端接口,允许用户对类似树形结构的大纲执行多个编辑操作。我认为这个大纲的构成记录总体上是一个单一的资源(/outlines/39),即使它的部分可以通过不同的URL作为单独的资源进行访问。

问题在于用户既可以编辑大纲中现有的节点,也可以向其中添加新节点。通常,当你编辑某个内容时,你会使用PUT方法进行更新,当你添加新内容时,你会使用POST方法;然而,在某些情况下,您可能希望将所有更改(包括添加和编辑)都包装在一个单一的事务中。人们如何处理这种情况呢?

尽管大纲已经存在,PUT方法似乎是适当的,但嵌入式的添加违反了PUT方法的幂等性。我不确定POST方法是否也适合。出于设计目的,我决定不保存用户进行的每个离散更新,尽管我想这提供了一种解决方案。仍然,肯定有其他人已经处理过我的问题或者对此有想法。

2个回答

1

你有没有办法让添加操作具有幂等性?例如,如果节点有一个自然键,那么当客户端尝试第二次添加节点时,你可以什么都不做。


没有自然键,但这让我考虑到服务器(或客户端)可以在我创建新节点时提供临时GUID。通过这种方式,记录将通过其ID和GUID进行识别。通过使用GUID,如果用户未能提交整个事务,我就不会消耗ID。关于这一点,是否应该使用GUID作为PK而不是标识种子,这值得思考。谢谢。 - Mario
有趣!很高兴我能帮到你。 - waterlooalex
经过进一步调查,我决定只有在完整地PUT资源时才是正确的。由于我只是将增量(添加/更新/删除节点)放回PUT,因此我认为将该增量放回到子资源URL更有意义,类似于您的事务子资源建议。我还没有解决细节问题。 - Mario

0
怎么样:创建一个新的资源:/outlines/39/transactions,然后将您的交易POST到该资源中,例如,
将“addNode=node1, addNode=node2, editNode=node3,newName=foobar” POST到/outlines/39/transactions。

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