При разработке интерфейса RESTful семантика типов запросов считается жизненно важной для проекта.
- GET - список коллекции или получить элемент
- PUT - заменить коллекцию или элемент
- POST - Создать коллекцию или элемент
- УДАЛИТЬ - Ну, ну, удалить коллекцию или элемент
Тем не менее, это не похоже на понятие «поиск».
Например, при разработке набора веб-служб, поддерживающих сайт поиска работы, у вас могут быть следующие требования:
- Получить индивидуальную работу объявления
- GET для
domain/Job/{id}/
- GET для
- Создать объявление о работе
- POST в
domain/Job/
- POST в
- Обновить вакансию
- Положить на
domain/Job/
- Положить на
- Удалить объявление о работе
- УДАЛИТЬ к
domain/Job/
- УДАЛИТЬ к
«Получить все рабочие места» также просто:
- GET для
domain/Jobs/
Однако как «поиск» попадает в эту структуру?
Вы можете утверждать, что это вариант «коллекции списков» и реализовывать как:
- GET для
domain/Jobs/
Однако поиск может быть сложным, и вполне возможно произвести поиск, который генерирует длинную строку GET. То есть, ссылаясь на вопрос SO здесь , возникают проблемы с использованием строк GET длиннее, чем около 2000 символов.
Примером может служить граненый поиск - продолжение примера «работа».
Я могу разрешить поиск по аспектам - «Технология», «Должность», «Дисциплина», а также ключевые слова в свободном тексте, возраст работы, местоположение и зарплата.
Благодаря гибкому пользовательскому интерфейсу и большому количеству технологий и названий должностей, возможно, что поиск может охватывать большое количество вариантов выбора.
Настройте этот пример на резюме, а не на вакансии, добавьте еще больше граней, и вы можете легко представить поиск с выбранной сотней граней или даже с 40 гранями, каждая из которых имеет длину 50 символов (например, названия должностей, названия университетов, Имена работодателя).
В этой ситуации может быть желательно переместить PUT или POST, чтобы обеспечить правильную отправку данных поиска. Например:
- POST в
domain/Jobs/
Но семантически это инструкция по созданию коллекции.
Вы могли бы также сказать , что вы будете выражать это как создание поиска:
- POST в
domain/Jobs/Search/
или (как предложено ниже)
- POST в
domain/JobSearch/
С семантической точки зрения это может иметь смысл, но вы на самом деле ничего не создаете, вы делаете запрос на данные.
Итак, семантически это GET , но GET не гарантирует поддержку того, что вам нужно.
Итак, вопрос в том, чтобы попытаться сохранить как можно более верный дизайн RESTful, и в то же время убедиться, что я соблюдаю ограничения HTTP, каков наиболее подходящий дизайн для поиска?
domain/Jobs?keyword={keyword}
. Это прекрасно работает для меня :) Я надеюсь, чтоSEARCH
глагол станет стандартом. programmers.stackexchange.com/questions/233158/…