Java 面向复杂操作的restapi设计

Java 面向复杂操作的restapi设计,java,c#,rest,api-design,restapi,Java,C#,Rest,Api Design,Restapi,询问- 正在构建RESTAPI以支持事务的搜索/过滤。下面是api预期支持的两个要求 通过[transactionid]数组检索事务列表-最小值为1 按((transactionType=销售或transactionType=退款)和storeid=XXXX)检索交易列表 我期待着设计这个职位的要求与假设搜索资源类似如下。在使用“AND”“OR”操作进行复杂查询时,我对上面的第二个要求感到困惑。我们将非常感谢围绕它的任何投入。API预计将支持在各种属性组合上搜索事务 要求1的设计 POST /s

询问-

正在构建RESTAPI以支持事务的搜索/过滤。下面是api预期支持的两个要求

  • 通过[transactionid]数组检索事务列表-最小值为1
  • 按((transactionType=销售或transactionType=退款)和storeid=XXXX)检索交易列表
  • 我期待着设计这个职位的要求与假设搜索资源类似如下。在使用“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/AandBorC?A=:x&B=:y&C=:z
    
    更常见的做法是查看您的领域专家语言以获取报告的名称,并使用该名称

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

    当我们开始必须通过web界面支持任意查询,并且这些查询变得足够复杂,以至于我们开始遇到URI长度等约束时,我们的退步位置是将POST与消息体中描述的查询一起使用

    这就是“好”;放弃缓存、安全性和幂等语义;但临时查询的业务价值可能会赢得折衷。

    如果“检索”本质上是只读操作,那么您应该优先考虑允许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/AandBorC?A=:x&B=:y&C=:z
    
    更常见的做法是查看您的领域专家语言以获取报告的名称,并使用该名称

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

    当我们开始必须通过web界面支持任意查询,并且这些查询变得足够复杂,以至于我们开始遇到URI长度等约束时,我们的退步位置是将POST与消息体中描述的查询一起使用


    这就是“好”;放弃缓存、安全性和幂等语义;但临时查询的业务价值可能会赢得交易。

    这是否回答了您的问题?这回答了你的问题吗?