Как написать REST API на PHP за 30 минут: пошаговое руководство для новичков

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как написать REST API на PHP за 30 минут: для начинающих

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

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

REST (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов. API, построенный по принципам REST, использует стандартные HTTP-методы для работы с ресурсами:

  • GET — получение данных (например, список пользователей);
  • POST — создание нового ресурса;
  • PUT — обновление существующего ресурса;
  • DELETE — удаление ресурса.

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

Шаг 1: Настройка структуры проекта

Прежде чем писать код, создайте простую структуру файлов. Для нашего API потребуется всего несколько файлов:

  • index.php — точка входа, которая будет обрабатывать все запросы;
  • .htaccess — для перенаправления всех запросов на index.php (если используете Apache);
  • config.php — настройки подключения к базе данных (опционально).

Создайте файл .htaccess в корневой папке проекта:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Этот код перенаправляет все запросы, которые не указывают на существующие файлы, на index.php. Теперь наш API будет обрабатывать любые URL, например /api/users или /api/users/1.

Шаг 2: Создание маршрутизатора и обработка запросов

Откройте файл index.php и напишите базовую логику маршрутизации. Мы будем определять HTTP-метод и URL, а затем вызывать соответствующие функции.

<?php
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");

$method = $_SERVER['REQUEST_METHOD'];
$request = explode('/', trim($_SERVER['PATH_INFO'] ?? '/', '/'));

// Простейший маршрутизатор
switch ($request[0] ?? '') {
    case 'users':
        handleUsers($method, $request);
        break;
    default:
        http_response_code(404);
        echo json_encode(["message" => "Route not found"]);
        break;
}

function handleUsers($method, $request) {
    $id = $request[1] ?? null;
    switch ($method) {
        case 'GET':
            if ($id) {
                // Получить одного пользователя
                echo json_encode(["message" => "Get user with id $id"]);
            } else {
                // Получить всех пользователей
                echo json_encode(["message" => "Get all users"]);
            }
            break;
        case 'POST':
            $input = json_decode(file_get_contents("php://input"), true);
            echo json_encode(["message" => "Create user", "data" => $input]);
            break;
        case 'PUT':
            if ($id) {
                $input = json_decode(file_get_contents("php://input"), true);
                echo json_encode(["message" => "Update user with id $id", "data" => $input]);
            } else {
                http_response_code(400);
                echo json_encode(["message" => "ID is required for update"]);
            }
            break;
        case 'DELETE':
            if ($id) {
                echo json_encode(["message" => "Delete user with id $id"]);
            } else {
                http_response_code(400);
                echo json_encode(["message" => "ID is required for delete"]);
            }
            break;
        default:
            http_response_code(405);
            echo json_encode(["message" => "Method not allowed"]);
    }
}
?>

Этот код создает простой REST API для работы с пользователями. Мы устанавливаем заголовки для работы с JSON и CORS, а затем маршрутизируем запросы в зависимости от URL. Обратите внимание на использование file_get_contents("php://input") для получения тела POST и PUT запросов.

Шаг 3: Подключение базы данных и работа с реальными данными

Теперь давайте заменим заглушки на реальную работу с базой данных. Создайте файл config.php для подключения к MySQL через PDO:

<?php
$host = 'localhost';
$dbname = 'api_db';
$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: " . $e->getMessage()]);
    exit;
}
?>

Предположим, у вас есть таблица users с полями id, name и email. Подключите config.php в index.php и перепишите функции:

require_once 'config.php';

function handleUsers($method, $request) {
    global $pdo;
    $id = $request[1] ?? null;

    switch ($method) {
        case 'GET':
            if ($id) {
                $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
                $stmt->execute([$id]);
                $user = $stmt->fetch(PDO::FETCH_ASSOC);
                if ($user) {
                    echo json_encode($user);
                } else {
                    http_response_code(404);
                    echo json_encode(["message" => "User not found"]);
                }
            } else {
                $stmt = $pdo->query("SELECT * FROM users");
                $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
                echo json_encode($users);
            }
            break;

        case 'POST':
            $input = json_decode(file_get_contents("php://input"), true);
            if (!isset($input['name']) || !isset($input['email'])) {
                http_response_code(                

Блоги

Рекомендаций по книгам