java - 用于复杂操作的 REST API 设计
问题描述
查询 -
致力于构建一个 Rest API 以支持交易的搜索/过滤。下面是两个需求,api预计支持
- 通过 [transactionid] 数组检索交易列表 - 最小值为 1
- 按 ((transactionType=Sale OR transactionType=Refund) AND storeid=XXXX)) 检索交易列表
我希望将其设计为 POST 请求,并假设搜索作为资源,如下所示。在使用“AND”“OR”操作进行复杂查询时,我对上述第二个要求感到困惑。任何有关它的输入将不胜感激。API 有望支持在不同属性组合上搜索交易
需求 1 的设计
POST /sales-transactions/search
{
searchrequestid:xxxxxx
transactionids:[1,2,3,4,..]
}
解决方案
如果“检索”本质上是只读操作,那么您应该优先考虑允许 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 和消息正文中描述的查询。
那是“很好”;你放弃了缓存、安全和幂等语义;但也有可能是临时查询的业务价值赢得了权衡。
推荐阅读
- python - 了解一个 LSTM 模型的概要
- ansible - 有没有办法在 GitLab CI 中按计划触发 webhook?
- apache-kafka - Kafka 无法跟踪最后提交的偏移量
- azure - ARM 模板复制功能未从参数中选取值
- c# - System.Data.SqlClient.SqlException:“服务器主体“域\用户”无法在当前安全上下文下访问数据库“db2”。
- php - 在 wordpress 上为已注销的用户显示菜单项
- java - 数据库中的外键始终为空
- python - 我正在尝试使用 Tweepy 和 Python 制作 Twitter 机器人,但出现错误 215?
- c++ - 如果类在堆上,函数会进入堆还是堆栈?
- go - 从 github 问题中检索最新评论