Если ты когда-нибудь думал, что API — это что-то сложное и доступное только гуру, спешу обрадовать: это не так. Сегодня мы вместе напишем простое REST API на чистом PHP, без фреймворков и лишней магии. Ты узнаешь, как это работает изнутри, и сможешь легко расширять свой код. Поехали!

Digital-студия WNDER

Что такое API и зачем оно тебе

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

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

Структура REST API: коротко о главном

Мы будем делать REST API. REST — это стиль архитектуры, где всё строится на ресурсах и HTTP-методах. Ресурс — это, например, «пользователь» или «статья». А методы — это действия: GET (получить), POST (создать), PUT (обновить), DELETE (удалить).

Вот как это выглядит на практике:

  • GET /users — получить список пользователей
  • GET /users/1 — получить пользователя с id=1
  • POST /users — создать нового пользователя
  • PUT /users/1 — обновить пользователя с id=1
  • DELETE /users/1 — удалить пользователя

Всё просто, правда? Теперь давай перейдём к коду.

Готовим окружение: что нужно для старта

Для работы нам понадобится:

  • PHP версии 7.4 или выше (лучше 8.0+, там много приятных фишек)
  • Локальный сервер (например, встроенный в PHP: php -S localhost:8000)
  • Редактор кода (VS Code, PHPStorm — что нравится)

Никаких фреймворков не нужно. Мы напишем всё руками, чтобы понять, как это работает. Это как учиться готовить: сначала варишь суп с нуля, а потом уже пользуешься полуфабрикатами.

Пишем простейший API на PHP: от идеи до кода

Создадим файл index.php. Это будет точка входа для всех запросов. Сначала настроим обработку CORS и заголовков, чтобы API могло вызываться с других доменов.


<?php

// Разрешаем запросы с любых доменов (для разработки)
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type');

// Получаем метод запроса
$method = $_SERVER['REQUEST_METHOD'];

// Получаем путь запроса (например, /users/1)
$path = $_SERVER['REQUEST_URI'];
$path = parse_url($path, PHP_URL_PATH);
$segments = explode('/', trim($path, '/'));

// Первый сегмент — это ресурс (например, 'users')
$resource = $segments[0] ?? null;

// Второй сегмент — это id (если есть)
$id = $segments[1] ?? null;

// Простой ответ по умолчанию
$response = ['message' => 'Hello, API!'];

// Обрабатываем запрос
switch ($resource) {
    case 'users':
        // Здесь будет логика для пользователей
        $response = ['users' => []];
        break;
    default:
        http_response_code(404);
        $response = ['error' => 'Not Found'];
        break;
}

echo json_encode($response);

Это каркас. Теперь добавим простую «базу данных» — массив в памяти. В реальной жизни ты бы использовал MySQL или PostgreSQL, но для обучения сойдёт.


// Простая база данных в памяти (для примера)
$users = [
    1 => ['name' => 'Иван', 'email' => 'ivan@example.com'],
    2 => ['name' => 'Мария', 'email' => 'maria@example.com'],
];

Теперь обработаем методы GET, POST, PUT, DELETE. Вот полный код:


<?php

header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type');

$method = $_SERVER['REQUEST_METHOD'];
$path = $_SERVER['REQUEST_URI'];
$path = parse_url($path, PHP_URL_PATH);
$segments = explode('/', trim($path, '/'));

$resource = $segments[0] ?? null;
$id = $segments[1] ?? null;

$users = [
    1 => ['name' => 'Иван', 'email' => 'ivan@example.com'],
    2 => ['name' => 'Мария', 'email' => 'maria@example.com'],
];

$response = [];

switch ($resource) {
    case 'users':
        switch ($method) {
            case 'GET':
                if ($id) {
                    if (isset($users[$id])) {
                        $response = $users[$id];
                    } else {
                        http_response_code(404);
                        $response = ['error' => 'User not found'];
                    }
                } else {
                    $response = array_values($users);
                }
                break;

            case 'POST':
                $input = json_decode(file_get_contents('php://input'), true);
                if (!isset($input['name']) || !isset($input['email'])) {
                    http_response_code(422);
                    $response = ['error' => 'Name and email are required'];
                    break;
                }
                $newId = max(array_keys($users)) + 1;
                $users[$newId] = ['name' => $input['name'], 'email' => $input['email']];
                http_response_code(201);
                $response = $users[$newId];
                break;

            case 'PUT':
                if (!$id) {
                    http_response_code(400);
                    $response = ['error' => 'ID is required'];
                    break;
                }
                $input = json_decode(file_get_contents('php://input'), true);
                if (isset($users[$id])) {
                    $users[$id]['name'] = $input['name'] ?? $users[$id]['name'];
                    $users[$id]['email'] = $input['email'] ?? $users[$id]['email'];
                    $response = $users[$id];
                } else {
                    http_response_code(404);
                    $response = ['error' => 'User not found'];
                }
                break;

            case 'DELETE':
                if (!$id) {
                    http_response_code(400);
                    $response = ['error' => 'ID is required'];
                    break;
                }
                if (isset($users[$id])) {
                    unset($users[$id]);
                    $response = ['message' => 'User deleted'];
                } else {
                    http_response_code(404);
                    $response = ['error' => 'User not found'];
                }
                break;

            default:
                http_response_code(405);
                $response = ['error' => 'Method not allowed'];
                break;
        }
        break;

    default:
        http_response_code(404);
        $response = ['error' => 'Not Found'];
        break;
}

echo json_encode($response);

Вот и всё! У нас есть работающий API. Ты можешь запустить его командой php -S localhost:8000 и попробовать отправить запросы через Postman или просто в браузере.

Правило: Всегда проверяй входные данные и возвращай понятные ошибки с правильными HTTP-кодами. Это спасёт тебя от множества проблем в будущем.

Практические советы и лайфхаки

Вот несколько вещей, которые я выучил за годы работы с API:

  • Всегда возвращай JSON. Даже если ошибка — сделай json_encode и установи правильный HTTP-код.
  • Используй версионирование. Например, /v1/users. Это позволит менять API без поломки у клиентов.
  • Обрабатывай CORS. Если API будут использовать с другого домена, настрой заголовки заранее.
  • Не забывай про OPTIONS. Для сложных запросов браузеры шлют предварительный запрос OPTIONS. На него нужно отвечать 200.

Сравни, что важно при разработке API:

Аспект Плохо Хорошо
Формат ответа Текст или HTML JSON
HTTP-коды Всегда 200 200, 201, 400, 404, 422 и т.д.
Безопасность Никакой Токены, проверка прав

Что дальше? Расширяем API

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


$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

Также можно добавить авторизацию через токены. Клиент отправляет токен в заголовке Authorization: Bearer <token>, а ты проверяешь его перед выполнением операции.

И не забывай про документацию. Хорошая документация — это половина успеха. Можно использовать Swagger или просто писать README.

Итоги: что мы сегодня сделали

Мы создали простое REST API на чистом PHP без единого фреймворка. Разобрались, что такое API, какие бывают методы, и написали рабочий код с обработкой всех основных операций. Теперь ты можешь расширять его, подключать базы данных и добавлять новые ресурсы.

Главное — не бойся экспериментировать. Пиши код, ломай его, исправляй — так рождается опыт. Удачи!

Студия WNDER