Передать несколько фильтров с несколькими значениями в строке запроса (REST) - PullRequest
0 голосов
/ 08 июля 2019

Первоначально я отправил несколько фильтров, содержащих несколько значений в JSON, как часть моего запроса GET, но я считаю, что это плохая практика, поэтому я изменил его на POST, но мне не нравится, так как получение результатов из запроса не имеет никакого отношения кделать с POST, поэтому я думаю, мне придется использовать строку запроса

Большинство примеров фильтров, которые я нашел, используют один фильтр или одно значение, но я смотрю, есть ли лучшийпопробуйте пропустить несколько фильтров с несколькими значениями для фильтрации как один параметр в строке запроса.

Например, это базовый фильтр, который ищет все автомобили красного цвета

GET / cars? color = red

Но что, если бы я хотел найти все автомобили, которые

красного, синего или зеленого цвета и имеют 2 места или меньше, и их торговая марка начинается с b и может быть куплена?в США, Великобритании или Германии

Будет ли в порядке следующее?

http://myserver/api/cars?color=red|blue|green¬seats<=2¬brand[startswith]b¬country=USA|UK|Germany </p>

Я предлагаю использовать:

  1. | символr в качестве разделителя между каждым значением для данного фильтра
  2. ¬ символ в качестве разделителя между каждым фильтром
  3. [начальный с] для обработки типа поиска, но может содержать [=, <=,> =, <>, [содержит], [заканчивается с] и т. д. *

Это будет затем проанализировано на стороне сервера, и соответствующие фильтры будут построены соответственно на основе предоставленных значений

Надеюсь, что это имеет смысл, но мне действительно интересно, есть ли стандартная / лучшая практика, используемая для таких сценариев с учетом REST?

Спасибо.

1 Ответ

0 голосов
/ 08 июля 2019

Как и в большинстве вопросов дизайна, ключ в том, чтобы иметь согласованный дизайн для всех ваших API.Вы можете следовать определенным общеизвестным рекомендациям / стандартам, чтобы ваш API легко обнаруживался.

Например, посмотрите на OData.Раздел «Запросы» на этой странице относится к вашему вопросу.Вот пример:

https://services.odata.org/v4/TripPinServiceRW/People?$top=2 &amp; $select=FirstName, LastName &amp; $filter=Trips/any(d:d/Budget gt 3000)

Другим вариантом является стандарт OpenSearch.Соответствующий раздел здесь .Вот пример:

https://opensearch.php?recordSchema=html&query=dc.creator any Mill* Grad*

Еще одна интересная опция - это GraphQL, которая упрощает сопоставление параметров запроса с параметрами выборки данных.Он использует полезную нагрузку фильтра вместо параметров запроса.Смотрите спецификацию здесь: GraphQL Spec .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...