Вопрос по соглашениям REST: поиск информации, где нужно много параметров
У меня есть маршрут на моем сервере /register_contacts, который принимает в качестве параметров длинный массив идентификаторов, ищет, какие из этих идентификаторов зарегистрированы в базе данных, и возвращает это подмножество.
Какой метод HTTP должен быть?
В настоящее время это запрос GET, так как я подумал, что он что-то делает GET, но затем мне немного не по себе из-за длинного массива идентификаторов, который в итоге делает запрос к конечной точке, например:
www.server.com/registered_contacts?ids[2]=bob&ids[54]=jon&ids[23]=jack...etc. etc.
Можно утверждать, что на самом деле я не получаю удаленную "вещь", такую как / зарегистрирован / контакты /42, можно также утверждать, что это ресурс, который я не обновляю, не удаляю и не создаю… так что у меня не получается?
(У меня также есть беспокойство, заголовок становится больше, чем размер пакета, но не уверен, что это станет проблемой)
2 ответа
Нет, GET - правильный метод. По сути, вы генерируете результат поиска на основе длинного списка критериев. Ваш метод (семантически говоря) идемпотентен, поэтому он не подходит для POST.
Предполагая, что вы не работаете с каким-то ограничением длины команды GET, которое существует, все в порядке.
Другой механизм состоит в том, чтобы взять ваши критерии, отправить его в ресурс "фильтра", а затем взять полученный URI из этого, а затем использовать этот URI в качестве аргумента для GET.
Create the filter:
POST /filter
ids[2]=bob......
Result:
HTTP/1.1 301 Moved Permanently
Location: /filter/1234
Use the filter:
GET /registerd_contacts?filter=http://example.com/filter/1234
Ваши фильтры - это первоклассный ресурс, который вы можете использовать CRUD, если хотите, или они могут "уйти" за день, или как вам угодно.