Как создать REST API на PHP с примерами кода

Как сделать rest api на php

Как сделать rest api на php

REST API на PHP чаще всего используют для обмена данными между сервером и клиентскими приложениями: веб-интерфейсами, мобильными приложениями, сторонними сервисами. PHP подходит для этой задачи благодаря простому доступу к HTTP-заголовкам, работе с JSON и широкой поддержке баз данных. Даже без фреймворков можно собрать понятный и поддерживаемый API, если сразу задать правильную структуру.

В основе REST API лежат стандартные HTTP-методы: GET для получения данных, POST для создания записей, PUT и PATCH для обновления, DELETE для удаления. PHP позволяет обрабатывать эти методы напрямую через $_SERVER[‘REQUEST_METHOD’], а данные запроса – через php://input. Ответы обычно возвращаются в формате JSON с явным указанием HTTP-кода, чтобы клиент корректно интерпретировал результат.

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

Материал ориентирован на разработчиков, которые хотят понять механику REST API на уровне PHP-кода, а не только на уровне теории. Все примеры можно проверить локально через curl или Postman, что упрощает отладку и тестирование запросов.

Выбор структуры проекта и настройка роутинга запросов

Выбор структуры проекта и настройка роутинга запросов

Структуру REST API на PHP удобнее формировать от точки входа. Чаще всего это файл index.php, который принимает все HTTP-запросы. Для этого в конфигурации веб-сервера настраивается перенаправление: в Apache через .htaccess с директивой RewriteRule, в Nginx – через try_files. Такой подход позволяет обрабатывать маршруты внутри приложения, а не создавать отдельный PHP-файл под каждый URL.

Минимальный набор каталогов обычно включает public (точка входа), src (логика приложения), config (настройки), routes (описание маршрутов) и controllers (обработчики запросов). Это упрощает навигацию по проекту и снижает риск смешивания бизнес-логики с кодом работы с HTTP.

Роутинг без фреймворков можно реализовать на основе URI и HTTP-метода. Запрашиваемый путь берётся из $_SERVER[‘REQUEST_URI’], метод – из $_SERVER[‘REQUEST_METHOD’]. После удаления параметров запроса URI разбивается на сегменты, по которым определяется нужный контроллер и действие. Например, запрос GET /api/users/15 можно разобрать как ресурс users и идентификатор записи.

Для повышения читаемости кода маршруты часто описывают в виде массива, где ключом выступает комбинация метода и пути, а значением – вызываемая функция или метод класса. Такой файл удобно хранить отдельно и подключать в точке входа. Это упрощает добавление новых эндпоинтов и снижает вероятность ошибок при ручной обработке условий.

При проектировании маршрутов имеет смысл сразу придерживаться REST-соглашений: использовать существительные во множественном числе, избегать глаголов в URL и передавать действия через HTTP-методы. Это делает API предсказуемым для клиента и упрощает тестирование запросов через curl и Postman.

Обработка HTTP методов GET POST PUT DELETE в PHP

Тип запроса определяется значением $_SERVER[‘REQUEST_METHOD’]. На его основе выбирается логика обработки ресурса. Проверку метода удобно выносить в точку входа или в контроллер, чтобы один URL корректно реагировал на разные действия клиента.

Метод GET применяется для чтения данных. Параметры обычно передаются через строку запроса и доступны в массиве $_GET. Для получения одного ресурса используется идентификатор в URI, например /api/products/10. В этом случае ID извлекается из пути, а не из параметров.

Метод POST используется для создания новых записей. Тело запроса чаще всего передаётся в формате JSON, поэтому данные читаются через поток php://input и декодируются функцией json_decode. Проверка наличия обязательных полей выполняется до обращения к базе данных.

Методы PUT и DELETE не заполняют суперглобальные массивы автоматически. Для их обработки также используется чтение входного потока. PUT применяется для обновления ресурса по конкретному ID, DELETE – для удаления записи без передачи тела запроса.

  • GET – чтение списка или одной записи без изменения данных
  • POST – добавление новой записи с передачей данных в теле запроса
  • PUT – обновление существующей записи по идентификатору
  • DELETE – удаление записи по указанному URI

Для упрощения логики обработки часто используют конструкцию switch по значению HTTP-метода. Это позволяет явно задать допустимые действия для ресурса и вернуть код 405, если метод не поддерживается.

  1. Определить HTTP-метод запроса
  2. Сопоставить метод с действием над ресурсом
  3. Получить входные данные из $_GET или php://input
  4. Вернуть ответ с соответствующим HTTP-кодом

Такой подход делает обработку запросов предсказуемой и упрощает добавление новых ресурсов без изменения существующей логики.

Формирование JSON ответов и установка HTTP кодов

Формирование JSON ответов и установка HTTP кодов

Ответ REST API должен быть однозначно интерпретируем клиентом. Для этого в PHP сначала задаётся заголовок Content-Type: application/json через header(), после чего данные кодируются функцией json_encode. Без указания типа содержимого браузеры и HTTP-клиенты могут неверно обработать тело ответа.

HTTP-код задаёт результат операции независимо от содержимого JSON. В PHP его устанавливают через http_response_code(). Например, при успешном чтении данных используется 200, при создании записи – 201, при отсутствии ресурса – 404. Код ошибки должен соответствовать ситуации, а не маскироваться под 200 с сообщением об ошибке.

Структура JSON-ответа должна быть стабильной. На практике удобно возвращать объект с ключами data и error. При успешном запросе заполняется data, при ошибке – error с текстом и, при необходимости, дополнительными полями. Это упрощает обработку ответа на стороне клиента.

При кодировании данных стоит использовать флаги JSON_UNESCAPED_UNICODE и JSON_UNESCAPED_SLASHES, чтобы сохранить читаемость ответа и избежать лишних экранирований. Если кодирование завершилось ошибкой, её можно проверить через json_last_error() и вернуть код 500.

Для ошибок валидации данных обычно применяется код 400, для отсутствия прав доступа – 401 или 403. Эти коды позволяют клиенту сразу понять причину сбоя без анализа текста сообщения. Тело ответа при этом остаётся в формате JSON, даже если запрос завершился ошибкой.

Подключение к базе данных и выполнение CRUD операций

Подключение к базе данных и выполнение CRUD операций

Для работы с базой данных в REST API на PHP чаще всего используют расширение PDO. Оно поддерживает разные СУБД и позволяет выполнять запросы с подготовленными выражениями. Подключение выносят в отдельный файл, где задаются DSN, логин, пароль и режим обработки ошибок через PDO::ATTR_ERRMODE со значением PDO::ERRMODE_EXCEPTION.

Создание записи реализуется через SQL-запрос INSERT, который выполняется с привязкой параметров. Данные, полученные из тела POST-запроса, передаются в prepare() и execute(). После успешной вставки полезно вернуть идентификатор новой записи, полученный через lastInsertId().

Чтение данных выполняется запросами SELECT. Для получения списка ресурсов используется fetchAll(PDO::FETCH_ASSOC), для одной записи – fetch(). При отсутствии результата следует вернуть код 404, а не пустой массив с кодом 200.

Обновление записи связано с методом PUT и запросом UPDATE. Идентификатор ресурса передаётся через URI, а новые значения – в теле запроса. Перед выполнением обновления имеет смысл проверить, существует ли запись с указанным ID, чтобы корректно обработать ситуацию с несуществующим ресурсом.

Удаление данных выполняется запросом DELETE. После выполнения операции стоит проверить количество затронутых строк через rowCount(). Если значение равно нулю, значит ресурс не найден, и API должно вернуть соответствующий HTTP-код.

Проверка входящих данных и обработка ошибок API

Проверка входящих данных и обработка ошибок API

Входящие данные REST API нельзя использовать напрямую. Для запросов с телом в формате JSON данные читаются через php://input и декодируются с проверкой результата. Если json_decode вернул null, а json_last_error() указывает на ошибку, API должно вернуть код 400 с сообщением о некорректном формате данных.

Проверка структуры данных выполняется до обращения к базе. Для каждого эндпоинта заранее определяется набор допустимых полей, их тип и ограничения. Например, числовые значения проверяются через is_numeric, строки – через trim и проверку длины, даты – через DateTime::createFromFormat. Лишние поля лучше игнорировать или явно отклонять.

При работе с параметрами URI идентификаторы ресурсов приводятся к целому типу и проверяются на положительное значение. Если ID отсутствует или не проходит проверку, API возвращает 400, не выполняя SQL-запрос. Это снижает нагрузку на базу и упрощает диагностику ошибок.

Ошибки доступа и авторизации должны обрабатываться отдельно от ошибок данных. При отсутствии или некорректности токена возвращается 401, при недостаточных правах – 403. Тело ответа при этом остаётся в формате JSON с кратким описанием причины.

Для обработки исключений удобно использовать единый блок try-catch на уровне контроллера или точки входа. В нём перехватываются ошибки PDO и пользовательские исключения. Клиенту возвращается общий текст ошибки без технических деталей, а служебная информация может записываться в лог.

Единый формат ошибок упрощает работу с API на стороне клиента. Обычно возвращается объект с ключом error, содержащим сообщение и код. Такой подход позволяет фронтенду или внешнему сервису обрабатывать сбои без анализа нестабильных текстовых ответов.

Примеры запросов к REST API через curl и Postman

Примеры запросов к REST API через curl и Postman

Для тестирования REST API на PHP удобно использовать командную строку с curl или графический инструмент Postman. Оба метода позволяют отправлять запросы с различными HTTP-методами и просматривать ответы с кодами и телом JSON.

Пример GET-запроса через curl для получения списка пользователей:

curl -X GET https://example.com/api/users -H "Accept: application/json"

Пример POST-запроса с JSON-телом для создания новой записи:

curl -X POST https://example.com/api/users \
-H "Content-Type: application/json" \
-d '{"name":"Иван","email":"ivan@example.com"}'

Для PUT-запроса на обновление записи по ID:

curl -X PUT https://example.com/api/users/15 \
-H "Content-Type: application/json" \
-d '{"name":"Иван Петров"}'

DELETE-запрос для удаления ресурса:

curl -X DELETE https://example.com/api/users/15

В Postman каждый запрос настраивается через интерфейс:

Метод URL Заголовки Тело
GET https://example.com/api/users Accept: application/json
POST https://example.com/api/users Content-Type: application/json {«name»:»Иван»,»email»:»ivan@example.com»}
PUT https://example.com/api/users/15 Content-Type: application/json {«name»:»Иван Петров»}
DELETE https://example.com/api/users/15

Использование curl и Postman позволяет проверять корректность HTTP-кодов, структуру JSON и обработку ошибок API перед интеграцией с фронтендом или сторонними сервисами.

Вопрос-ответ:

Как правильно организовать структуру REST API на PHP без использования фреймворков?

Для небольшой системы достаточно выделить несколько директорий: public для точки входа, src для логики приложения, controllers для обработчиков запросов, routes для маршрутов и config для настроек. В index.php настраивается обработка всех запросов через HTTP-методы и маршруты. Такой подход упрощает поддержку кода и добавление новых ресурсов.

Каким образом в PHP обрабатывать разные HTTP методы в REST API?

HTTP метод запроса определяется через $_SERVER[‘REQUEST_METHOD’]. Для GET извлекаются параметры через $_GET, для POST данные читаются через php://input и декодируются из JSON. PUT и DELETE также используют поток php://input для получения данных. На основе метода выбирается соответствующее действие: чтение, создание, обновление или удаление записи в базе.

Как формировать корректные JSON ответы и устанавливать HTTP коды в API?

Перед выводом данных следует установить заголовок Content-Type: application/json. Данные кодируются через json_encode с флагами JSON_UNESCAPED_UNICODE и JSON_UNESCAPED_SLASHES. HTTP код задаётся через http_response_code(): 200 для успешного чтения, 201 при создании, 400 при ошибках запроса, 404 для отсутствующего ресурса. Ошибки всегда возвращаются в JSON с ключом error и описанием причины.

Какие рекомендации по безопасному подключению к базе данных и выполнению CRUD операций в PHP?

Подключение осуществляется через PDO с DSN, логином, паролем и режимом ошибок PDO::ERRMODE_EXCEPTION. Для операций используют подготовленные выражения (prepare и execute), что предотвращает SQL-инъекции. INSERT возвращает lastInsertId(), SELECT использует fetch или fetchAll, UPDATE и DELETE проверяют rowCount() для определения успешного выполнения.

Как проверять входящие данные и корректно обрабатывать ошибки в REST API на PHP?

Данные из POST, PUT или PATCH запросов читаются через php://input и декодируются с проверкой json_last_error(). Структура и типы полей проверяются заранее: строки, числа, даты. Ошибки валидации возвращают код 400 с описанием проблемы. Исключения от PDO или пользовательские ошибки обрабатываются через try-catch и возвращаются в JSON с кодом 500 или другим соответствующим.

Как правильно организовать маршруты и обработку запросов в REST API на PHP без использования фреймворков?

Для организации маршрутов удобно использовать единый файл маршрутов, где каждая комбинация HTTP-метода и пути сопоставляется с конкретной функцией или методом контроллера. В точке входа (index.php) определяется HTTP-метод через $_SERVER[‘REQUEST_METHOD’] и URI через $_SERVER[‘REQUEST_URI’]. Путь разбивается на сегменты для извлечения ресурсов и идентификаторов, после чего вызывается соответствующий обработчик. Такой подход позволяет добавлять новые эндпоинты без изменения основной структуры приложения, поддерживает понятное разделение логики и упрощает отладку запросов через curl или Postman.

Ссылка на основную публикацию