Давайте рассмотрим общий пример ресурсов, которые вы можете моделировать, с остальным API, встроенным в PHP.
Поэтому логика говорит о том, что наши конечные точки должны быть
/v1/garages /v1/garages/1234 /v1/mechanics /v1/mechanics/1234 /v1/cars /v1/cars/1234
Если бы мы хотели получить все автомобили гаража 1234, мы бы использовали GET /v1/garages/1234/cars
Если бы мы хотели, чтобы все автомобили для механика 12 находились в гараже 34, мы использовали бы GET /v1/mechanics/12/garage/34/cars
Но как насчет того, хотели ли мы все автомобили из гаражей 56 И 78?
У меня есть несколько идей в виду, но лучшее, что я могу придумать, это GET /v1/cars?garage=[id=[56,78]]
Что позволило бы нам захватить все зеленые автомобили с двумя или четырьмя дверями из любых гаражей, имеющих желтую краску и углеродные крышки через GET /v1/cars?garage=[paint=yellow,bonnet=[material=carbon]]&color=green&doors=[2,4]
Кажется ли это разумной идеей, или я буду сталкиваться с проблемами, связанными с этим сложением с гнездом, должно ли это быть достаточно простым для анализа с помощью PHP?
Еще одна идея, которую я имел, это Json, насколько я знаю, все json действительны в URL-адресе, поэтому
GET /v1/cars?{"color":"green","doors":[2,4],"garage":{"paint":"yellow","bonnet":{"material":"carbon"}}}
Это делает его очень простым для разработчиков, потому что почти все языки программирования теперь поддерживают json, а на конце API мы можем просто использовать json_decode($_SERVER[''QUERY_STRING])
, есть ли проблемы с использованием Json?
Третья идея «создать поиск»
Под этим я подразумеваю, что мы используем
POST /cars/search
с указанным выше Json в качестве почтовых данных, запрос будет просто вернуть идентификатор поиска, к которому результаты могут быть получены с помощью GET /cars/search/{id}
это уменьшит сложность на моей стороне и избежит предел 8kb для запросов (это API, который не предназначен для использования в адресных барах браузера). но я обеспокоен тем, что если я это сделаю, то он победит цель конечной точки GET /v1/cars
top верхнего уровня?
Благодаря полезным парням в канале #laravel irc , у меня был довольно продолжительный разговор, у нас есть ответ, который, кажется, работает.
Мы выбрали этот ответ на основе нескольких вещей:
Основной запрос был бы
GET /v1/cars?color=green &doors=2,4 &garage[paint]=yellow &garage[bonnet][material]=carbon
Что в сочетании со следующим кодом
$query = array(); parse_str($_SERVER['QUERY_STRING'], $query);
Выплескивает массив, подобный ниже, который можно легко повторить в API для фильтрации. 🙂
Array ( [color] => green [doors] => 2,4 [garage] => Array ( [paint] => yellow [bonnet] => Array ( [material] => carbon ) ) )