Вы когда-нибудь хотели, чтобы ваше PHP-приложение общалось с другими сервисами? Или чтобы мобильное приложение получало данные с вашего сайта? Тогда REST API — это то, что вам нужно. В этой статье я расскажу, как создать свой первый REST API на PHP. Без сложных терминов, с живыми примерами и практическими советами.

Что такое REST API и зачем он нужен?

Представьте, что ваш сайт — это ресторан. Клиент (пользователь) приходит и заказывает еду. Официант (API) принимает заказ, передаёт его на кухню (сервер) и приносит готовое блюдо обратно. REST API работает так же: он принимает запросы от клиента, обрабатывает их на сервере и возвращает ответ.

REST (Representational State Transfer) — это набор правил, как строить такие запросы. Основные принципы:

  • Использование HTTP-методов (GET, POST, PUT, DELETE) для операций с данными
  • Каждый ресурс (например, пользователь или товар) имеет свой URL
  • Ответы обычно в формате JSON
  • Сервер не хранит состояние клиента (stateless)

Зачем это нужно? Допустим, у вас есть интернет-магазин. Через API вы можете:

  • Показывать товары в мобильном приложении
  • Интегрироваться с платёжными системами
  • Дать доступ партнёрам к вашим данным
Правило №1: Всегда используйте стандартные HTTP-методы. GET для чтения, POST для создания, PUT для обновления, DELETE для удаления. Не изобретайте велосипед.

Подготовка окружения и первый эндпоинт

Для начала нам понадобится 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);
}
Правило №2: Всегда экранируйте входные данные. Используйте подготовленные запросы (prepared statements) для защиты от SQL-инъекций. Никогда не вставляйте данные напрямую в SQL-запрос.

Пример безопасного создания пользователя:

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-статусов, которые вы будете использовать:

КодОписаниеКогда использовать
200OKУспешный GET или PUT
201CreatedУспешный POST (создание ресурса)
204No ContentУспешный DELETE
400Bad RequestНекорректные входные данные
404Not FoundРесурс не найден
405Method Not AllowedНеподдерживаемый HTTP-метод
500Internal Server ErrorОшибка сервера

Пример централизованной обработки ошибок:

function sendError($code, $message) {
    http_response_code($code);
    echo json_encode(['error' => $message]);
    exit;
}

// Использование
if (!$user) {
    sendError(404, 'User not found');
}
Лайфхак: Используйте однообразный формат ошибок. Например, всегда возвращайте объект с полем "error". Это упростит жизнь фронтенд-разработчикам.

Тестирование 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 — это мост между вашим приложением и внешним миром. Делайте его надёжным и понятным.

Студия WNDER