如何解决API设计:以XML表示搜索条件
| 去年,我的小组开发了一种包含基本搜索功能的Web服务。 所有搜索条件都结合了布尔AND:<conditions>
<condition name=\"name1\">value1</condition>
<condition name=\"name2\">value2</condition>
<conditions>
...相当于name1 = value1 AND name2 = value2等
现在,我们被要求扩展搜索功能以允许更复杂的搜索。
我看到两种可行的方法:
选项#1:让用户传递自己的SQL查询(完整子句或仅\'where)。
例子:
<where>Cost = 5000.00 OR Cost > 5000.00</where>
<query>SELECT cmis:name FROM cmis:document WHERE cmis:name LIKE \'%test%\'</query>
先例:
IBM FileNet API中的Searchsql.SetWhereClause
内容管理互操作性服务(CMIS)规范
ADO在各种地方都使用这种方法。例如,recordset.Filter
优点:
我们的架构保持简单。对于简单的用例,我们可以保留\“ <filter type=\'and\'>
<condition attribute=\'lastname\' operator=\'ne\' value=\'Cannon\' />
</filter>
先例:
提取XML
蚂蚁与解决方法
选项#2(如果仅出于以下原因):安全性。
允许最终用户将任意SQL传递到您的数据库是灾难的诱因。您要么让您的用户相信永远不要在SQL中犯错误,要么您必须编写代码来确定要接受的SQL和要拒绝的SQL。
选项#2较难设计和实现,但选项#1保证当某些用户更新重要表中的每条记录时,您有时会讨厌自己。
,从安全角度来看,我同意DWRoelands关于选项#1的想法很糟糕。
我建议使用与您的选择2类似的选择3,但使用DSL(特定于域的语言)。因此,您将获得类似以下内容的信息:
<condition expression=\"$firstname=\'John\' and $lastname !=\'Doe\'\"/>
然后,服务器将需要具有解析器来编译和运行表达式。您可以自由设计表达式的语法以适合您的需求。
我已经亲自实现了您的选择2和DSL。由于它的灵活性,我更喜欢DSL,它使我的XML看起来更干净。没错,这种方法将需要更多的服务器端编码,但是我宁愿做更多的工作,也不愿让用户做更多的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。