В прошлом году моя группа разработала веб-сервис, включающий основные функции поиска.
Все условия поиска, где в сочетании с логическим И:
<conditions>
<condition name="name1">value1</condition>
<condition name="name2">value2</condition>
<conditions>
... эквивалентно name1 = значение1 И имя2 = значение2 и т. Д.
Теперь нас попросили расширить функцию поиска для более сложных поисков.
Я вижу два вероятных подхода:
ВАРИАНТ № 1: разрешить пользователям передавать собственный SQL-запрос (либо полное предложение, либо просто «где»).
Примеры:
<where>Cost = 5000.00 OR Cost > 5000.00</where>
<query>SELECT cmis:name FROM cmis:document WHERE cmis:name LIKE '%test%'</query>
Прецедент:
Преимущества:
- Наша схема остается простой. Мы могли бы оставить подход «» для простых вариантов использования и добавить альтернативный синтаксис.
- Мы бы просто использовали предложение WHERE непосредственно на стороне сервера (после очистки для SQL-инъекций) == более чистый код на стороне сервера
- Соответствует отраслевым стандартам (это? CMIS, Microsoft ... что-нибудь из мира Java?)
Недостатки:
- Не совсем "элегантный xml" (есть ли такая вещь?). Потенциально вынуждает потребителей услуг совершать какие-то хакерские манипуляции со строками, вместо того, чтобы предоставлять им что-то более изящное
ВАРИАНТ № 2. Пересмотрите наш подход, чтобы разрешить более детальные запросы в запросе мыла.
Пример (из FetchXML):
<filter type='and'>
<condition attribute='lastname' operator='ne' value='Cannon' />
</filter>
Прецедент:
Преимущества:
- Возможно, в большей степени соответствует ожиданиям конечного пользователя (часто это признак хорошего API)
- Потенциал для предоставления конечным пользователям более чистого кода
- Не создает зависимости от языка SQL / бэкэнда. Сохраняет это абстрактным
Недостатки:
- Требуется больше серверного кода для преобразования XML в оператор SQL, который пользователь изначально имел в виду
Я надеюсь, что примеры, прецедент, преимущества и недостатки дают достаточно оснований, чтобы избежать субъективных ответов. Я ищу ответы, основанные на стандартах и лучших практиках.
У меня вопрос: есть ли явные причины для выбора одного подхода над другим при расширении API?