Вы когда-нибудь хотели, чтобы ваше PHP-приложение общалось с другими сервисами? Или чтобы мобильное приложение получало данные с вашего сайта? Тогда REST API — это то, что вам нужно. В этой статье я расскажу, как создать свой первый REST API на PHP. Без сложных терминов, с живыми примерами и практическими советами.
Что такое REST API и зачем он нужен?
Представьте, что ваш сайт — это ресторан. Клиент (пользователь) приходит и заказывает еду. Официант (API) принимает заказ, передаёт его на кухню (сервер) и приносит готовое блюдо обратно. REST API работает так же: он принимает запросы от клиента, обрабатывает их на сервере и возвращает ответ.
REST (Representational State Transfer) — это набор правил, как строить такие запросы. Основные принципы:
- Использование HTTP-методов (GET, POST, PUT, DELETE) для операций с данными
- Каждый ресурс (например, пользователь или товар) имеет свой URL
- Ответы обычно в формате JSON
- Сервер не хранит состояние клиента (stateless)
Зачем это нужно? Допустим, у вас есть интернет-магазин. Через API вы можете:
- Показывать товары в мобильном приложении
- Интегрироваться с платёжными системами
- Дать доступ партнёрам к вашим данным
Подготовка окружения и первый эндпоинт
Для начала нам понадобится PHP (версия 7.4 или выше) и веб-сервер (например, Apache или Nginx). Я буду использовать встроенный сервер PHP для простоты.
Создайте папку проекта, например my-api. Внутри создайте файл index.php — это будет точка входа для всех запросов.
Вот простейший пример обработки GET-запроса:
<?php
// Заголовки для работы с JSON
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// Получаем метод запроса
$method = $_SERVER['REQUEST_METHOD'];
// Массив с данными (имитация базы)
$users = [
['id' => 1, 'name' => 'Иван', 'email' => 'ivan@example.com'],
['id' => 2, 'name' => 'Мария', 'email' => 'maria@example.com']
];
if ($method === 'GET') {
// Возвращаем список пользователей
echo json_encode($users);
} else {
// Если метод не поддерживается
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
}
?>Запустите сервер командой php -S localhost:8000 и откройте в браузере http://localhost:8000. Вы увидите JSON с пользователями. Поздравляю, ваш первый эндпоинт готов!
Маршрутизация и обработка разных методов
В реальном API нужно обрабатывать разные URL и методы. Давайте добавим маршрутизацию. Создадим файл router.php:
<?php
// Подключаем файл с маршрутами
require_once 'routes.php';
// Получаем путь из URL
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$method = $_SERVER['REQUEST_METHOD'];
// Простой роутер
if ($uri === '/users' && $method === 'GET') {
getUsers();
} elseif ($uri === '/users' && $method === 'POST') {
createUser();
} elseif (preg_match('/^\/users\/(\d+)$/', $uri, $matches) && $method === 'GET') {
getUserById($matches[1]);
} else {
http_response_code(404);
echo json_encode(['error' => 'Not found']);
}
?>Теперь создадим routes.php с функциями-обработчиками:
<?php
function getUsers() {
$users = [
['id' => 1, 'name' => 'Иван', 'email' => 'ivan@example.com'],
['id' => 2, 'name' => 'Мария', 'email' => 'maria@example.com']
];
echo json_encode($users);
}
function createUser() {
// Получаем данные из тела запроса
$input = json_decode(file_get_contents('php://input'), true);
if (!$input || !isset($input['name']) || !isset($input['email'])) {
http_response_code(400);
echo json_encode(['error' => 'Invalid input']);
return;
}
// Здесь обычно сохранение в БД
$newUser = [
'id' => rand(100, 999),
'name' => $input['name'],
'email' => $input['email']
];
http_response_code(201);
echo json_encode($newUser);
}
function getUserById($id) {
// Поиск пользователя по ID
$users = [
['id' => 1, 'name' => 'Иван', 'email' => 'ivan@example.com'],
['id' => 2, 'name' => 'Мария', 'email' => 'maria@example.com']
];
$user = array_filter($users, function($u) use ($id) {
return $u['id'] == $id;
});
if (empty($user)) {
http_response_code(404);
echo json_encode(['error' => 'User not found']);
return;
}
echo json_encode(array_values($user)[0]);
}
?>Теперь вы можете тестировать API через curl или Postman:
# Получить всех пользователей
curl http://localhost:8000/users
# Создать нового пользователя
curl -X POST -H "Content-Type: application/json" -d '{"name":"Пётр","email":"petr@example.com"}' http://localhost:8000/users
# Получить пользователя по ID
curl http://localhost:8000/users/1Работа с базой данных и безопасность
В реальных проектах данные хранятся в базе. Давайте подключим MySQL через PDO. Создадим файл db.php:
<?php
$host = 'localhost';
$dbname = 'my_api';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed']);
exit;
}
?>Теперь перепишем функцию getUsers для работы с БД:
function getUsers() {
global $pdo;
$stmt = $pdo->query('SELECT id, name, email FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($users);
}Пример безопасного создания пользователя:
function createUser() {
global $pdo;
$input = json_decode(file_get_contents('php://input'), true);
if (!$input || !isset($input['name']) || !isset($input['email'])) {
http_response_code(400);
echo json_encode(['error' => 'Invalid input']);
return;
}
// Подготовленный запрос
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute([
':name' => $input['name'],
':email' => $input['email']
]);
$newId = $pdo->lastInsertId();
http_response_code(201);
echo json_encode(['id' => $newId, 'name' => $input['name'], 'email' => $input['email']]);
}Обработка ошибок и HTTP-статусы
Хорошее API должно возвращать понятные ошибки. Вот таблица основных HTTP-статусов, которые вы будете использовать:
| Код | Описание | Когда использовать |
|---|---|---|
| 200 | OK | Успешный GET или PUT |
| 201 | Created | Успешный POST (создание ресурса) |
| 204 | No Content | Успешный DELETE |
| 400 | Bad Request | Некорректные входные данные |
| 404 | Not Found | Ресурс не найден |
| 405 | Method Not Allowed | Неподдерживаемый HTTP-метод |
| 500 | Internal Server Error | Ошибка сервера |
Пример централизованной обработки ошибок:
function sendError($code, $message) {
http_response_code($code);
echo json_encode(['error' => $message]);
exit;
}
// Использование
if (!$user) {
sendError(404, 'User not found');
}Тестирование API с помощью JavaScript
Чтобы проверить API в браузере, можно написать простой HTML-файл с JavaScript:
<!DOCTYPE html>
<html>
<head>
<title>Тест API</title>
</head>
<body>
<h1>Пользователи</h1>
<div id="users"></div>
<script>
fetch('http://localhost:8000/users')
.then(response => response.json())
.then(data => {
const container = document.getElementById('users');
data.forEach(user => {
const div = document.createElement('div');
div.textContent = user.name + ' (' + user.email + ')';
container.appendChild(div);
});
})
.catch(error => console.error('Ошибка:', error));
</script>
</body>
</html>Откройте этот HTML в браузере. Если всё настроено правильно, вы увидите список пользователей.
Что в итоге
Мы создали простое REST API на PHP с нуля. Вы научились:
- Настраивать маршрутизацию
- Обрабатывать разные HTTP-методы
- Работать с базой данных через PDO
- Возвращать правильные HTTP-статусы
- Тестировать API через curl и JavaScript
Это база, на которой можно строить более сложные проекты. Добавьте аутентификацию, версионирование, документацию (например, Swagger) — и ваше API будет готово к продакшену.
Помните главное: API — это мост между вашим приложением и внешним миром. Делайте его надёжным и понятным.



