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.