首页 > 解决方案 > 用于复杂操作的 REST API 设计

问题描述

查询 -

致力于构建一个 Rest API 以支持交易的搜索/过滤。下面是两个需求,api预计支持

  1. 通过 [transactionid] 数组检索交易列表 - 最小值为 1
  2. 按 ((transactionType=Sale OR transactionType=Refund) AND storeid=XXXX)) 检索交易列表

我希望将其设计为 POST 请求,并假设搜索作为资源,如下所示。在使用“AND”“OR”操作进行复杂查询时,我对上述第二个要求感到困惑。任何有关它的输入将不胜感激。API 有望支持在不同属性组合上搜索交易

需求 1 的设计

POST /sales-transactions/search
{
  searchrequestid:xxxxxx
  transactionids:[1,2,3,4,..]
}

标签: javac#api-designrest

解决方案


如果“检索”本质上是只读操作,那么您应该优先考虑允许 GET 而不是 POST 的设计。

想想“网页上的搜索表单”;您在输入控件中输入一堆信息,当您提交表单时,浏览器会创建一个请求,例如

GET /sales-transactions/search?searchrequestid=xxxxxx&transactionIds=1,2,3,4...

查询参数可以被认为是替换,机器不关心哪些参数用于 AND 哪些用于 OR。

select * from transactions where A = :x and B = :y or C = :z
GET /sales-transactions/search?A=:x&B=:y&C=:z

因为机器不在乎,你可以自由选择拼写,让你的一些人更容易。所以你可以改为,例如,尝试类似的东西

GET /sales-transactions/AandBorC?A=:x&B=:y&C=:z

更常见的是查看您的领域专家语言作为报告名称,并使用它

GET /some-fancy-domain-name??A=:x&B=:y&C=:z

当我们开始必须通过 Web 界面支持任意查询,并且这些查询变得足够复杂以至于我们开始遇到 URI 长度等约束时,后备位置是使用 POST 和消息正文中描述的查询。

那是“很好”;你放弃了缓存、安全和幂等语义;但也有可能是临时查询的业务价值赢得了权衡。


推荐阅读