10. Создание REST API и работа с JSON

Введение

Современные сайты и приложения часто должны обмениваться данными: мобильное приложение получает новости, JavaScript на сайте подгружает комментарии, а другой сервер запрашивает отчёты. Всё это делается через API — интерфейс для обмена информацией.

REST API — это самый популярный стандарт. Он основан на простых HTTP-запросах (GET, POST, PUT, DELETE) и передаёт данные в формате JSON.

REST API — это как мост между приложением и сервером. Один задаёт вопросы, другой отвечает.

Что такое REST

REST (Representational State Transfer) — стиль взаимодействия, где всё строится на простых запросах к URL.

Например:

  • GET /notes — получить все заметки
  • POST /notes — создать новую заметку
  • PUT /notes/5 — обновить заметку с ID 5
  • DELETE /notes/5 — удалить заметку с ID 5

Каждый такой запрос возвращает ответ в формате JSON.

Что такое JSON

JSON (JavaScript Object Notation) — это лёгкий формат обмена данными, понятный и человеку, и машине.

Пример:


{
  "title": "Первая заметка",
  "text": "Сегодня я научился делать API",
  "user_id": 1
}

JSON поддерживается в любом языке: PHP, JavaScript, Python, Java и т.д.

Работа с JSON в PHP


$data = ['title' => 'Пример', 'done' => false];
echo json_encode($data); // → {"title":"Пример","done":false}

$json = '{"a":1,"b":2}'; $array = json_decode($json, true); // true = вернуть как массив print_r($array);

Создаём простейший REST API

Предположим, у нас есть база данных с таблицей notes. Мы хотим получить список заметок в виде JSON.

Шаг 1. Подготовка файла

Создаём файл api.php:

<?php
header('Content-Type: application/json; charset=utf-8');
require 'Database.php';

$db = new Database(); $method = $_SERVER['REQUEST_METHOD']; // определяем метод запроса

switch ($method) { case 'GET': $data = $db->query('SELECT * FROM notes ORDER BY id DESC')->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['status' => 'ok', 'notes' => $data], JSON_UNESCAPED_UNICODE); break;

case 'POST': $input = json_decode(file_get_contents('php://input'), true); $title = $input['title'] ?? ''; $text = $input['text'] ?? ''; if ($title && $text) { $db->query('INSERT INTO notes (title, text, user_id) VALUES (?, ?, ?)', [$title, $text, 1]); http_response_code(201); echo json_encode(['status' => 'created']); } else { http_response_code(400); echo json_encode(['status' => 'error', 'message' => 'Неполные данные']); } break;

default: http_response_code(405); echo json_encode(['status' => 'error', 'message' => 'Метод не поддерживается']); } ?>

Как это работает

  • header('Content-Type: application/json') — сообщает браузеру, что ответ в JSON
  • json_decode() — превращает JSON из запроса в PHP-массив
  • json_encode() — превращает массив обратно в JSON-ответ
  • http_response_code() — возвращает код статуса HTTP (200, 201, 400 и т.д.)

Пример тестирования через curl


# Получить список заметок
curl http://localhost/api.php

# Создать новую заметку curl -X POST http://localhost/api.php \ -H "Content-Type: application/json" \ -d '{"title":"API тест","text":"Работает отлично!"}'

Результат:


{"status":"created"}

Добавляем PUT и DELETE

Для полного CRUD добавим ещё два метода.

switch ($method) {
  case 'PUT':
    $data = json_decode(file_get_contents('php://input'), true);
    $db->query('UPDATE notes SET title=?, text=? WHERE id=?', [$data['title'], $data['text'], $data['id']]);
    echo json_encode(['status' => 'updated']);
    break;

case 'DELETE': $data = json_decode(file_get_contents('php://input'), true); $db->query('DELETE FROM notes WHERE id=?', [$data['id']]); echo json_encode(['status' => 'deleted']); break; }

Теперь API поддерживает все четыре метода: GET, POST, PUT, DELETE.

Пример PUT-запроса


curl -X PUT http://localhost/api.php \
  -H "Content-Type: application/json" \
  -d '{"id":5,"title":"Обновлено","text":"Текст изменён"}'

Результат: ``` {"status":"updated"} ```

Авторизация через токен

Для защиты API добавим проверку по токену.

<?php
$headers = getallheaders();
$token = $headers['Authorization'] ?? '';
if ($token !== 'Bearer my_secret_key') {
  http_response_code(401);
  echo json_encode(['status' => 'error', 'message' => 'Доступ запрещён']);
  exit;
}
?>

Теперь к каждому запросу нужно добавить заголовок:


-H "Authorization: Bearer my_secret_key"

Пример использования API из JavaScript

Можно подключить API к фронтенду с помощью fetch:

fetch('http://localhost/api.php')
  .then(res => res.json())
  .then(data => {
    console.log('Список заметок:', data.notes);
  });

Добавление новой заметки через JS


fetch('http://localhost/api.php', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ title: 'Новая заметка', text: 'Создана через JS' })
})
  .then(r => r.json())
  .then(console.log);

Типичные ошибки при работе с API

    [li Не указан заголовок Content-Type: application/json — сервер не понимает формат.[/li]
  • Не используется php://input — POST-данные не читаются.
  • Пропущен http_response_code() — клиенту непонятно, успешно ли выполнено действие.
  • Отсутствует json_encode() — ответ приходит как текст, а не JSON.

Преимущества REST API

  • JSON прост и универсален
  • Можно подключать мобильные и SPA-приложения
  • Лёгкая интеграция с JavaScript, Python, Node.js
  • Разделение серверной и клиентской логики

Практическое задание

Попробуйте:
  • Добавить метод GET /notes/{id} — получить одну заметку по ID
  • Реализовать проверку токена авторизации
  • Сделать JS-страницу, где заметки отображаются и создаются через fetch

Итоги урока

Теперь вы умеете:
  • Создавать REST API на PHP с PDO
  • Работать с JSON: кодировать и декодировать
  • Использовать GET, POST, PUT, DELETE-запросы
  • Добавлять токен авторизации и коды ответов
  • Подключать фронтенд и обмениваться данными