08. Создание REST API и работа с JSON
Что такое REST API
REST API (Representational State Transfer) — это способ взаимодействия между клиентом (например, JavaScript, мобильным приложением) и сервером через обычные HTTP-запросы.Представь, что REST API — это официант между пользователем и базой данных: клиент просит, сервер возвращает нужные данные в формате JSON.
Основные принципы REST
- GET — получить данные (например, список записей).
- POST — создать новую запись.
- PUT — обновить запись.
- DELETE — удалить запись.
Что такое JSON
JSON (JavaScript Object Notation) — это лёгкий формат обмена данными, который легко читается и человеком, и машиной.Пример массива в PHP и его JSON-версия:
$array = ['a' => 1, 'b' => 2];
echo json_encode($array);
// {"a":1,"b":2}
Чтобы получить обратно PHP-массив из JSON:
$json = '{"a":1,"b":2}';
$data = json_decode($json, true);
print_r($data);
// Array ( [a] => 1 => 2 )
Создаём простое REST API
Допустим, у нас есть таблица [b]notes:
CREATE TABLE notes (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
text TEXT
);
Создадим файл 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) VALUES (?, ?)', [$title, $text]);
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' => 'Метод не поддерживается']);
}
?>
Как это работает
- PHP проверяет метод запроса (GET или POST).
- Если GET — возвращает список заметок в JSON.
- Если POST — принимает JSON, добавляет запись в базу и возвращает ответ.
Пример запроса через curl
curl -X POST http://localhost/api.php \
-H "Content-Type: application/json" \
-d '{"title":"Первая заметка","text":"Привет, API!"}'
Возврат ошибок
Важно возвращать коды состояния (status codes), чтобы клиент понимал, что произошло.- 200 — OK (запрос выполнен успешно).
- 201 — Created (запись создана).
- 400 — Bad Request (ошибка в данных).
- 404 — Not Found (ресурс не найден).
- 405 — Method Not Allowed (метод не поддерживается).
Добавляем обновление и удаление
case 'PUT':
$input = json_decode(file_get_contents('php://input'), true);
$id = $input['id'] ?? 0;
$text = $input['text'] ?? '';
if ($id && $text) {
$db->query('UPDATE notes SET text=? WHERE id=?', [$text, $id]);
echo json_encode(['status'=>'updated']);
} else {
http_response_code(400);
echo json_encode(['status'=>'error','message'=>'Некорректные данные']);
}
break;case 'DELETE':
parse_str(file_get_contents('php://input'), $data);
$id = $data['id'] ?? 0;
if ($id) {
$db->query('DELETE FROM notes WHERE id=?', [$id]);
echo json_encode(['status'=>'deleted']);
}
break;
Тестирование API в браузере
Открой http://localhost/api.php — должен вернуться JSON со списком заметок.Можно также использовать Postman или Insomnia для тестирования разных методов (GET, POST, PUT, DELETE).
Безопасность REST API
- Проверяйте тип запроса ($_SERVER['REQUEST_METHOD']).
- Проверяйте входные данные — filter_var, htmlspecialchars.
- Используйте prepare + execute для защиты от SQL-инъекций.
- Не выводите ошибки сервера напрямую пользователю.
- Добавляйте авторизацию (токен или API-ключ) для закрытых операций.
Мини-проект: список заметок с REST API
// api.php — серверная часть
// index.html — клиентская часть (запрос через JS)fetch('api.php')
.then(res => res.json())
.then(data => {
data.notes.forEach(n => {
document.body.innerHTML += `<h3>${n.title}</h3><p>${n.text}</p>`;
});
});
Теперь ты создал настоящий API, который можно подключить к сайту или приложению!
Типичные ошибки новичков
- Не ставят `header('Content-Type: application/json')` — браузер показывает нечитаемые символы.
- Отправляют JSON без `Content-Type: application/json` — сервер не понимает формат.
- Не используют `json_decode()` — данные не парсятся.
- Не проверяют метод запроса — API может случайно удалить всё!
Практические задания
- Создай API для таблицы products с методами GET (список товаров) и POST (добавление товара).
- Добавь проверку, чтобы нельзя было создать товар без названия.
- Напиши клиентский JS, который выводит список товаров на странице.
Итоги урока
Теперь вы умеете:- Создавать REST API на PHP.
- Передавать и принимать данные в формате JSON.
- Работать с методами GET, POST, PUT, DELETE.
- Возвращать правильные HTTP-коды и JSON-ответы.
- Понимать основы безопасности при работе с API.