Итак, эта часть для тех, кто уже познакомился с основами REST и готов начинать проектировать собственное API. Здесь мы рассмотрим полный цикл резработки RESTful API.
-
Определение требований.
На этом этапе мы должны определить для чего мы разрабатываем наше API: для взаимодействия с веб-приложением или с программой, а может быть это вообще публичное API, которое будет использоваться на широкую аудиторию. Отталкиваясь этих бизнес-требований, мы будем выбирать стек технологий:
- выбор ЯП (языка программирования)
- БД (базы данных)
- целесообразность подключения и выбор фреймворка (Laravel, Symfony)
- Определение ресурсов.
Ресурс в REST API - это объект или данные, с которыми работает API. Это может быть пользователи (
users
), заказы (orders
), товары (products
), статьи (articles
) или любой другой элемент, который можно запрашивать, создавать, обновлять или удалять. Каждый ресурс имеет свой уникальный URL, и взаимодействие с ним происходит с помощью стандартных методов HTTP. - Определение структуры URL (эндпроинтов) и выделение HTTP методов.
Для выполнения операций над ресурсами, мы должны использовать основные HTTP методы:
- GET - получение ресурса
- POST - создание нового ресурса (новая запись в БД, например заявка с сайта)
- PUT/PATCH - обновление ресурса
PUT - предполагает полное обновление ресурса (передаются все поля, даже те, где значения не изменились, в противном случае данные в таких полях в БД сбросятся до данных по-умолчанию). Проще реализуются. Лучше кешируется.
PATCH используется для частичного обновления. Он обновляет только те поля, которые указаны в запросе, а остальные не изменяет. Сложнее реализовать, нужно писать дополнительную логику. Труднее кешируется, также требует определённых настроек.
- DELETE - удаление данных
Каждый эндпоинт (конкретный URL-адрес в API) должен соответствовать определённому методу, это делает API более интуитивно понятным и предсказуемым для других разработчиков. Например:
GET /products — список товаров POST /products — добавление нового товара GET /products/{product_id} — информация о конкретном товаре
Плохими практиками использования HTTP методов при проектировании REST API будет:
- Отправка всех запросов к API только через один метод GET или только через POST.
- Передача данных JSON в body через GET.
Многие сетевые фильтры, браузеры просто теряют Body где-то по пути. Имейте это ввиду и используйте только
Query параметры. Также браузеры имеют ограничения по длине URL: не рекомендуется использовать URL длиной более 2048 символов. - Не передаём параметры через заголовки запроса. Делаем это либо через Query-параметры в GET или через JSON в body метода POST/PUT.
Верные практики проектирования эндпроинтов в REST API:
Удачные Неудачные
• используется верный метод для получения информации • есть версионированиеGET /api/v1/products/123
Лучше заранее предусмотреть версионирование, чтобы в будущем можно было обновлять API без нарушения совместимости • наименование ресурса всегда во множественном числеPOST /api/product/123
• эндроинты не засорены глаголами • используется верное применение методов Глаголы в URL не только избыточны, но и сбивают с толку, так как нарушают REST-принципы.GET /users/123
POST /users
DELETE /users/123GET /getUser/123
POST /createUser
DELETE /deleteUser/123
• эндпроинт не указывает на действие в URL (передача действий в URL противоречит принципам REST) • верное использование метода для обновления ресурса • данные передаются в body через JSONPUT /users/123/status
Body: { "status": "active" }
POST /users/123/activate
POST /users/123/deactivate
• верное использование методов • действия не передаются через query-параметры и эндпоинт соответствует принципам RESTPOST /users
DELETE /users/123GET /users?action=create
GET /users?action=delete&id=123
• нет большой вложенности, легко читаем • отражает оптимальную структуру данныхGET /products/123/reviews/456?shop_id=10&department_id=5
GET /shops/10/departments/5/products/123/reviews/456
• айди указан как как частьGET /products/123
path parameters
- правильная идентификация ресурса в REST-принципыGET /products?id=123
- Определение формата ответа. Обычно это JSON. В редких случаях XML.
- Определение кода статусов и обработки ошибок.
Используем правильные коды статусов HTTP:
200 OK
— успешный запрос,201 Created
— ресурс успешно создан,400 Bad Request
— ошибка в запросе,404 Not Found
— ресурс не найден,500 Internal Server Error
— ошибка на сервере.
Придерживаемся стандартов, не лепим отсебятину в виде своих собственных кодов ошибок: это упростит жизнь коллегам и обеспечит корректную работу библиотек и клиентов, которые ожидают стандартной обработки HTTP-ошибок.
- Реализация и тестирование.
На этапе разработки создайте первую версию API и протестируйте её. Это можно сделать с помощью инструментов вроде Postman или автоматизированных тестов, проверяя правильность работы методов и соответствие требованиям.
- Документирование.
Наконец, создайте документацию, чтобы сделать API понятным для разработчиков. Инструменты вроде Swagger или Blueprint помогут описать каждый эндпоинт, параметры и возможные ответы.
В заключении подытожим: хорошо спроектированный REST API должен быть простым, логичным и предсказуемым, с чётким разделением обязанностей между URL и HTTP-методами. Так что придерживайтесь принципов, не лепите отсебятины и будет вам счастье в разработке!