Intereting Posts
как запомнить входные данные в формах даже после обновления страницы? Нужна помощь с моей функцией PHP пейджера теперь, когда я использую mod-rewrite База данных – управление версиями данных в одной таблице Учение вызывает много запросов для отношений «один ко многим» как сделать regexp не голодным с кавычками? ckeditor не загружает элемент, сгенерированный с помощью ajax-вызова? Selenium / PHPUnit: завершение сеанса при повторном использовании сеансов браузера? «Строка не может быть проанализирована как XML» ошибка php Справка по меню рекурсивного меню навигации PHP Внедрение междоменной связи между сайтами через CORS с использованием PHP и Javascript echo значение функции не будет передаваться по форме Проблема с RSA-шифрованием строки в PHP и передача ее в .NET-службу Получить статус выхода из скрипта php внутри сценария оболочки Перемещение базы данных на один домен на другой PHP / Mysql Order by and Rand ()

URL-дизайн для расширенной фильтрации результатов в обновленном API

Давайте рассмотрим общий пример ресурсов, которые вы можете моделировать, с остальным 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 ) ) )