【问题标题】:Advanced search REST API高级搜索 REST API
【发布时间】:2016-05-01 15:43:52
【问题描述】:

我的要求是实现高级搜索 Rest API 来搜索手机。搜索 API 的 URI 是 http://myservice/api/v1/phones/search?q=${query_expression}

其中q 是复杂的查询表达式。有以下问题

1) 由于高级搜索涉及冗长的查询表达式,URI 不适合 GET 调用。是否可以通过 POST 请求实现搜索 API 并仍然保持 RESTful 状态?

2) 我遇到了以下高级搜索的实现:

  • 第一种方法 - 发送查询表达式的完整中缀表达式。 例如。

PHONENAME STARTSWITH 'AR' AND ( PHONETYPE = '4G' OR PHONECOLOR = 'RED')

  • 第二种方法 - 以 json 的形式构建整个查询表达式。 例如。

    {"criteria":[ {"index":1,"field":"PHONENAME","value":"AR","comparator":"STARTSWITH"}, {"index":2,"field":"PHONETYPE","value":"4G","comparator":"EQUALS"}, {"index":3,"field":"PHONECOLOR","value":"RED","comparator":"EQUALS"} ],"criteria":"( 1 AND (2 OR 3) )"}

  • 第三种方法 - 将查询表达式实现为 json 的替代方法。 例如。

    {"and":[ {"field":"PHONENAME","value":"AR","comparator":"STARTSWITH"}, "or":[ {"field":"PHONETYPE","value":"4G","comparator":"EQUALS"}, {"field":"PHONECOLOR","value":"RED","comparator":"EQUALS"}] ]}

在这三种方法中,哪种方法更符合 RESTful 标准?欢迎提出任何其他方法的建议:)

【问题讨论】:

  • 我认为,对带有参数的某些资源执行 GET 是 REST 所需要的。您指定为参数的内容对 REST 无关紧要(如果它不是 URI 或其他资源)。所以我会选择选项 1,或者类似的东西,在 URI 中易于阅读。

标签: api rest search filter


【解决方案1】:
  1. 是的,POST 是万能的。 首选将它用于资源创建,但根据规范,它也可以以这种方式使用。但是,您应该考虑将端点更改为/search-results。这使您可以灵活地稍后开始存储搜索结果,并且您可以返回指向特定复杂查询结果的Location 标头。另一种选择是让用户POST 他们的搜索条件,然后执行 GET /search-results?criteria={id}。

  2. 不要做第二个。它很难阅读并且比它应该的更复杂。第一个或第三个都很好。第一个更紧凑,但在后端可能更难处理。第三,你真的不需要索引。

【讨论】:

    【解决方案2】:

    您可以遵循 ElasticSearch 采用的方法,在您给出的示例中是第三个。

    https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

    第三种方法也更容易理解和维护。 例如,如果将来您需要添加“模糊”查询运算符并且它会具有完全不同的模型,那将是一件容易的事情。

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2012-03-11
      • 2018-07-13
      相关资源
      最近更新 更多