Название, вероятно, плохо сформулировано, но я пытаюсь создать REST api с помощью symfony. Я изучил несколько общедоступных API-интерфейсов, чтобы почувствовать это, и общий принцип, похоже, касается одного пути к ресурсу за раз. Однако данные, с которыми я работаю, имеют много уровней (7-8), и каждый уровень гарантированно уникален только для своего родителя (весь путь составляет составной ключ).

В этой структуре я хотел бы получить все дочерние ресурсы от всех или нескольких родителей. Я знаю о фильтрации данных с использованием queryParam в конце URI, но похоже, что указание родительских идентификаторов в качестве массива лучше.

В качестве примера предположим, что у меня есть компании в моей базе данных, у которых есть маршрутизаторы, которые делегируют трафик для некоторого количества устройств. REST URI для получения всех устройств для маршрутизатора может выглядеть следующим образом:

/devices/company/:c_id/routers/:r_id/getdevices

Но затем пользователь должен просмотреть все: r_id, чтобы получить все устройства компании. Некоторые предложения, которые я видел, включают перемещение: r_id из пути и использование его в строке запроса:

/devices/company/:c_id/getdevices?router_id[]=1&router_id[]=2

Я понял, но не хотел бы использовать его на этом этапе.

Вместо этого то, что кажется функционально лучше, но сомнительно с философской точки зрения, делает следующее:

/devices/company/:c_id/routers/:[r_ids]/getdevices

Где [r_ids] - это строковый массив идентификаторов, который может быть декодирован в массив целых чисел / строк на стороне сервера. Это также освобождает строку параметров запроса, чтобы сосредоточиться на фильтрации устройств по атрибутам (возраст, цена, общий трафик, статус).

Однако я новичок во всем этом и не могу найти то, что является «стандартным». Это разумное решение?

Добавлю, что тестировал строку массива в Symfony, и она отлично работает. Но я не могу сказать, может ли он стать средством для злонамеренных запросов, поскольку я собираюсь использовать DBAL Doctrine - я тоже воспользуюсь советами (хотя это кажется проблемой независимо от идентификатора строки)

0
Optimum 19 Май 2021 в 21:22

1 ответ

Лучший ответ

Однако я новичок во всем этом и не могу найти то, что является «стандартным». Это разумное решение?

TL; DR: да, все в порядке.

Вы, вероятно, увидите идентификатор, подобный описанному, используя шаблон RI уровня 4 U с ваш список идентификаторов, закодированных с помощью расширения сегмента пути.

Ваш пример шаблона может выглядеть примерно так:

/devices/company{/c_id}/routers{/r_ids}/devices

И вам нужно будет сообщить потребителю шаблона, что c_id - это идентификатор компании, а r_ids - это список идентификаторов маршрутизатора или что-то еще.

Вы видели упрощенные версии этого в Интернете: шаблоны URI - это обобщения веб-форм, которые считывают информацию из элементов управления вводом и кодируют ввод в строку запроса.

1
VoiceOfUnreason 20 Май 2021 в 04:02