Разработка API: выражение критериев поиска в XML

#xml #web-services #architecture

#xml #веб-сервисы #архитектура

Вопрос:

В прошлом году моя группа разработала веб-сервис, который включал базовые функции поиска. Все условия поиска в сочетании с логическим И:

 <conditions>
  <condition name="name1">value1</condition>
  <condition name="name2">value2</condition>
<conditions>
  

… эквивалентно name1=значение1 И name2=значение2 и т.д.

Теперь нас попросили расширить функцию поиска, чтобы обеспечить более сложный поиск. Я вижу два вероятных подхода:

ВАРИАНТ № 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>
  

Прецедент:

Преимущества:

  • Наша схема остается простой. Мы могли бы оставить подход «<условия>» на месте для простых вариантов использования и добавить альтернативный синтаксис.
  • Мы бы просто использовали предложение WHERE непосредственно на стороне сервера (после очистки для внедрения sql) == более чистый код на стороне сервера
  • Соответствует отраслевым стандартам (так ли? CMIS, Microsoft… что-нибудь из мира Java?)

Недостатки:

  • Не совсем «элегантный xml» (есть ли что-нибудь подобное?). Потенциально заставляет потребителей сервиса выполнять некоторые хакерские манипуляции со строками на своей стороне, вместо того, чтобы предоставлять им что-то более элегантное.

ВАРИАНТ № 2. Измените наш подход <условия>, чтобы разрешить более детализированные запросы в запросе soap.

Пример (из FetchXML):

  <filter type='and'> 
     <condition attribute='lastname' operator='ne' value='Cannon' /> 
 </filter> 
  

Прецедент:

Преимущества:

  • Возможно, более соответствует ожиданиям конечного пользователя (часто признак хорошего API)
  • Возможность предоставления конечным пользователям более чистого кода
  • Не создает зависимости от языка SQL / серверной части. Сохраняет его абстрактным

Недостатки:

  • Требуется больше серверного кода для преобразования XML в инструкцию SQL, которую пользователь имел в виду в первую очередь

Я надеюсь, что приведенные примеры, прецеденты, преимущества и недостатки дают достаточно информации, чтобы избежать субъективных ответов. Я ищу ответы, основанные на стандартах и передовой практике.

Мой вопрос таков: существуют ли окончательные причины для выбора одного подхода вместо другого при расширении API?

Комментарии:

1. Зачем вообще представлять их в XML?

2. Это веб-сервис. XML определяется XSD в WSDL.

3. Вам нужны логические операторы И операторы отношений как часть ваших критериев поиска?

4. Да — И, ИЛИ, НЕТ, >, >=, <, <= и т.д. Полный набор.

Ответ №1:

Вариант №2, хотя бы по одной причине: безопасность.

Разрешать конечным пользователям передавать произвольный SQL в вашу базу данных — это приглашение к катастрофе. Вы либо доверяете своим пользователям НИКОГДА не допускать ошибок в SQL, либо вам приходится писать код, чтобы определить, какой SQL вы собираетесь принять, а какой отклонить.

Вариант № 2 будет сложнее спроектировать и реализовать, но вариант № 1 гарантирует, что вы возненавидите себя в какой-то момент, когда какой-нибудь пользователь обновит каждую запись в важной таблице.

Ответ №2:

Я согласен с DWRoelands в том, что вариант № 1, вероятно, является плохой идеей с точки зрения безопасности.

Я бы предложил Вариант № 3, который похож на ваш вариант № 2, но использует DSL (Domain Specific Language). Таким образом, у вас будет что-то вроде:

 <condition expression="$firstname='John' and $lastname !='Doe'"/>
  

Затем серверу потребуется анализатор для компиляции и запуска выражения. Вы вольны спроектировать синтаксис выражения в соответствии с вашими потребностями.

Я лично реализовал ваш вариант № 2 и DSL ранее. Мне больше нравится DSL из-за его гибкости, и это делает мой XML более чистым. Вы правы в том, что такой подход потребует большего количества кодирования на стороне сервера, но я предпочитаю выполнять больше работы, чем позволять пользователю выполнять больше работы.

Комментарии:

1. Спасибо за этот ответ — мне самому это нравится больше, и я вижу, где это делает синтаксис более элегантным. Наша команда проголосовала за вариант № 1, но я буду помнить об этом на будущее.