Что такое API Resource в моих проектах Laravel
На примере списка фотографий я расскажу как работает API Resource.
При работе с API предполагается, что всегда передаются заголовки:
Content-Type: application/json Accept: application/json
Для маршрутов, которые требуют авторизации:
Authorization: Bearer {token}
Где {token} - токен авторизации
Для Front программистов передается ссылка на API Resource, ссылка передается относительно домена сайта.
Вот какие URL при этом будут работать:
- GET /photos, функция index: Получить список всех элементов с пагинацией. Параметры, по которым можно осуществлять фильтрацию будут указаны в блоке meta-filters, там же будет показан пример-объяснение как именно будет примеряется фильтр при передачи значения.
- GET /photos/create, функция create. Получить пустой экземпляр элемента (его нужно заполнить и передать в функцию store). Это что-то вроде болванки от элемента от index, без заполненных данных.
- POST /photos, функция store. Создать новый элемент.
- GET /photos/{id}, функция show. Получить элемент по id. Как правило, внутри show параметров показывается существенно больше, чем в index. Пример: для index будет показан только name (название фото) + preview (адрес маленькой картинки), а уже в show - будут показаны и автор, и характеристики фотографии и другие дополнительные параметры
- PUT /photos/{id}, функция update. Обновить элемент.
- DELETE /photos/{id}, функция destroy. Удалить элемент
Если в описании API указано, например, вот так:
api/counties - получить список стран, только index
Это значит, что для этого метода доступно только получение списка
api/counties - получить список стран, только index,show
Значит кроме списка - можно получить еще и сам элемент по id, например:
GET api/counties/1
Описание структуры API ответа
При получении одного элемента тело ответа может выглядеть вот так:
{ "id": 1, "name": "Подразделение 1", "short_name": "П1", "group_id": 1, "type_enum": "Подразделение", "division_type_enum": "Главное управление", "icon_enum": "-", }
Или вот так, когда ответ завернут в блок data:
{ "data": { "id": 1, "name": "Подразделение 1", "short_name": "П1", "group_id": 1, "type_enum": "Подразделение", "division_type_enum": "Главное управление", "icon_enum": "-", } }
Второй вариант - предпочтительный, так как тогда и ответ в случае метода index (когда показываем список) - тоже будет завернут в блок data.
Пример ответа, когда мы показываем список элементов:
{ "data": [ { "id": 1, "short_name": "П1", }, { "id": 2, "short_name": "П2", } ], ... }
Для функции index есть дополнительные функциональные блоки.
"meta-filters": { "country_id": "country_id = value", "per_page": "number of elements per page, default: per_page = 20" },
В блоке указано какие фильтры можно применять к списку.
В указанном выше примере - можно передать в качестве GET параметра country_id, что отфильтровать вывод по стране. В описании параметра указано, что будет искаться точное соответствие переданному значению.
per_page - управляет количеством выводимых элементов при постраничной навигации. По-умолчанию - 20.
"links": { "self": "link-value", "first": "https://site.ru/api/regions?page=1", "last": "https://site.ru/api/regions?page=3", "prev": null, "next": "https://site.ru/api/regions?page=2" },
first - ссылка на получение первой страницы списка
last - ссылка на последнюю страницу списка
prev - ссылка на предыдущую страницу списка
next - ссылка на следующую страницу
Если ссылки нет (например это первая/последняя страница) - то в переменной будет 0
"meta": { "current_page": 1, "from": 1, "last_page": 1, "path": "https://site.ru/api/regions", "per_page": 20, "to": 3, "total": 3 }
current_page - текущая страница
last_page - номер последней страницы
per_page - сколько элементов на страницу выводить
total - сколько всего страниц
Целиком ответ на метод index может выглядеть, например, вот так:
{ "data": [ { "id": 1, "short_name": "П1", }, { "id": 2, "short_name": "П2", } ], "links": { "self": "link-value", "first": "https://site.ru/api/regions?page=1", "last": "https://site.ru/api/regions?page=3", "prev": null, "next": "https://site.ru/api/regions?page=2" }, "meta": { "current_page": 1, "from": 1, "last_page": 3, "path": "https://site.ru/api/regions", "per_page": 20, "to": 20, "total": 56 } "meta-filters": { "country_id": "country_id = value", "per_page": "number of elements per page, default: per_page = 20" }, }