Вопрос о соглашениях REST: получение информации, где требуется множество параметров

У меня есть маршрут на моем сервере /registered _contacts, который принимает в качестве параметров длинный массив идентификаторов, ищет, какой из этих идентификаторов зарегистрирован в базе данных, и возвращает это подмножество.

Какой HTTP-метод должен быть таким?

В настоящее время это запрос GET, так как я решил, что он что-то делает, но я тоже немного неспособен с длинным массивом идентификаторов, который заканчивает запрос к конечной точке, например:

www.server.com/registered_contacts?ids[2]=bob&ids[54]=jon&ids[23]=jack...etc. etc.

Можно утверждать, что я на самом деле не получаю удаленную "вещь", как /registered/contacts/ 42, можно также утверждать, что это ресурс, который я не обновляю, не удаляю и не создаю... так что листья становятся?

(У меня также есть заголовок, который больше размера пакета, не уверен, что это станет проблемой)

Ответ 1

Нет, GET - правильный метод. Вы по существу генерируете результат поиска на основе длинного списка критериев. Ваш метод (семантически говоря) идемпотент, почему он не подходит для POST.

Ответ 2

Предполагая, что вы не работаете с некоторым пределом длины команды GET, который существует, вы в порядке.

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