我正在寻找REST API“干运行”操作的最佳实践。
假设我有一个端点,将资金从账户A转移到账户B.我可以像这样开始转账:
POST /transactions
{
"amount": 1000, // how much to transfer
"source": "A", // account to transfer from
"destination": "B" // account to transfer to
}
此操作会创建一个“事务”,因此响应将是一个事务对象,其有效负载包含:
{
"id": "txn-123",
"amount": 1000,
"source": "A",
"destination": "B",
"fees": 10, // any fees that were charged
"balance": 2500 // balance in source account AFTER transfer
}
我希望能够在几个原因下进行干跑:
那么,“干跑”概念的最佳实践是什么?我可以想到几个选择:
到目前为止,这些是我对此事的看法,但我很高兴听到其他人的想法。
答案 0 :(得分:2)
选项3显然是错误的。你无缘无故地迫使客户做额外的工作。
选项1和2之间的选择取决于品味和API的细节。目前尚不清楚将/dry-run-transaction
视为一种独立于交易的事物是多么合理。
如果选择选项2,请考虑将/dry-run-transaction
作为短期资源,或者根本不保留它。这样客户可以通过POST查看费用,节省存储空间。
如果您使用选项1,我认为技术上最正确的选项是在有效负载中包含一个属性,例如execute: false
。这会将所有信息返回给客户端,并允许他们使用execute: true
对事务执行PUT以完全按原样提交。这种方法的一个缺点是你会有一堆未执行的事务(永远?),因为人们会在看到结果后决定不执行它们。
我认为安全根本没有进入讨论。如果你真的很担心,只需将execute: false
作为选项1的默认值。
另一种方法可能是使端点/transactions
和/transaction-results
。如果您发布到/transaction
,则执行该事务并获取永久交易结果的ID /结果。如果您POST到/ transaction-results,则会得到一个没有id的响应以及该事务的一组瞬态结果。注意我已经考虑了这20秒,所以可能会有一个明显的问题,我还没有看到。 : - )
答案 1 :(得分:0)
恕我直言,我不认为 POST 应该用于试运行。 Dry run 具有幂等语义,因为它不会改变系统的状态,这与 POST 相矛盾。另一方面,PUT 虽然幂等也不是一个好的选择,因为它意味着状态改变。如果我们真的想要 REST-full,那真的让 GET 成为唯一的选择。 因此我会创建一个单独的 REST 点:
GET /transactions/dry-run
在 URL 中嵌入 {amount, source, and target}
,如下所示:
GET /transactions/dry-run?amount=100&source=A&target=B