REST / ROA Architecture - Отправить параметры поиска / запроса / фильтрации / сортировки в базе данных в URL? (>, <, IN и т. Д.) - PullRequest
3 голосов
/ 01 июня 2010

Я создаю REST-интерфейс для моего приложения, используя ROA (Resource-Oriented Architecture).

Я бы хотел дать клиенту возможность указывать параметры поиска в URL. Чтобы клиент мог сказать: «Дайте мне всех людей, которые:

  • "first_name" равно "BOB"
  • «возраст» больше, чем «30»
  • сортировка по "фамилии"

Я думал что-то вроде:

GET /PEOPLE/{query_parameters}/{sort_parameters}

... или, возможно,

GET /PEOPLE?query=<query_string>&sort=<sort_string>

... но я не уверен, какой синтаксис будет полезен для указания в трех экземплярах COLUMN_NAME-OPERATOR-VALUE. Я думал, что-то вроде:

column_name.operator.value

Чтобы клиент мог сказать:

GET /PEOPLE?query=first_name.EQUALS.bob&query=age.GREATER_THAN.30&sort=last_name.ASCENDING

Я действительно не хочу заново изобретать колесо, есть ли приемлемые способы, как это сделать? Я использую Restlets, я не знаю, если это имеет значение.

Ответы [ 4 ]

2 голосов
/ 02 июня 2010

я бы добавил параметры поиска как отдельные параметры. выделенный язык подзапроса часто сложнее обрабатывать + читать (особенно потому, что его нужно кодировать по URL). так что я бы не стал использовать полноценный синтаксис SQL. Добавляйте только те параметры, которые вам действительно нужны и имеют смысл в поиске, меньшая сложность может означать более простую обработку :)

мин / макс материал я бы добавил к тому же параметру. /people?age=10,20

Обратите внимание на ',', он неявно предлагает вам синтаксис диапазона. Я нахожу это более читабельным, как наличие minAge и maxAge.

для открытого диапазона вы можете сделать: /people?age=10,*

сортировка, которую я бы сделал: /people?sortField=name&sortOrder=ascending

1 голос
/ 28 июня 2012

Я обновил более подробную информацию и понимание этого на http://nsinfra.blogspot.in/2011/12/simplifying-restful-search.html. Я чувствую, что вы можете найти это полезным.

1 голос
/ 01 июня 2010

Почему вы не думаете о том, чтобы сделать поиск первоклассным ресурсом? См. Ниже, вы можете указать objectType в searchQuery, чтобы указать, что вы ищете ресурс People.

/search/{searchQuery}

Например, приведенный ниже запрос указывает на поиск всех людей в возрасте от 30 до 50 лет.

/search?objectType=People&ageField1=30&ageField2=50&inclusive=true

С сортировкой можно делать то же самое.

1 голос
/ 01 июня 2010

Я бы пошел на что-то вроде этого:

GET /PEOPLE?first_name=bob&min_age=30&sort=last_name.asc,age.desc

И, следите за SQL-инъекциями:)

...