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-запросы
- Добавлять токен авторизации и коды ответов
- Подключать фронтенд и обмениваться данными