我的要求是实施高级搜索Rest API以搜索手机。搜索API的URI为Python styleguide (PEP 8) $ {query_expression}
其中 q 是复杂的查询表达式。有以下问题
1)由于高级搜索涉及冗长的查询表达式,因此URI不适合GET调用。是否可以通过POST请求实现搜索API并仍然保持RESTfulness?
2)我遇到了以下高级搜索实现:
{"and":[
{"field":"PHONENAME","value":"AR","comparator":"STARTSWITH"},
"or":[
{"field":"PHONETYPE","value":"4G","comparator":"EQUALS"},
{"field":"PHONECOLOR","value":"RED","comparator":"EQUALS"}]
]}
第二种方法 - 以json的形式构造整个查询表达式。 例如。
{{1}}
第3种方法 - 将查询表达式实现为json的替代方法。 例如
{{1}}
三种方法中哪种方法更加RESTful?欢迎任何其他方法的建议:)
答案 0 :(得分:2)
你可以按照ElasticSearch采用的方法,你给出的例子中的第三个是。
请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
第三种方法也更容易理解,更易于维护。 例如,如果将来你需要添加“模糊”查询运算符,它将有一个完全不同的模型,这将是一件容易的事情。
答案 1 :(得分:2)
是的,POST
是一个全能的。 首选将其用于资源创建,但根据规范,它也可以以这种方式使用。但是,您应该考虑将端点更改为/search-results
。这使您可以灵活地在以后开始存储搜索结果,并且可以返回指向特定复杂查询结果的Location
标头。另一种方法是让用户POST
使用他们的搜索条件,然后执行GET /搜索结果?criteria = {id}。
不要做第二个。它难以阅读,而且比它应该更复杂。第一个或第三个都没问题。第一种是更紧凑但在后端可能更难处理。对于第三个,你真的不需要索引。