Вопрос по соглашениям 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, если хотите, или они могут "уйти" за день, или как вам угодно.

Другие вопросы по тегам