Глава 16. JSON, API и обмен данными в PHP
JSON стал стандартным форматом обмена данными между сайтами, мобильными приложениями, внешними сервисами и API. В PHP с JSON работают при интеграции с Telegram, платежными системами, CRM, интернет-магазинами, JavaScript-приложениями и внутренними сервисами.
Преобразование массива в JSON
Функция json_encode() преобразует массив или объект в JSON-строку. Для русских символов полезен флаг JSON_UNESCAPED_UNICODE.
$data = [
'status' => 'ok',
'message' => 'Данные сохранены',
];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
Чтение JSON
json_decode() преобразует JSON в объект или массив. Второй параметр true возвращает ассоциативный массив.
$json = '{"id": 10, "title": "Товар"}';
$item = json_decode($json, true);
echo $item['title'];
Проверка ошибок
JSON может быть некорректным. После декодирования стоит проверять ошибку или использовать флаг JSON_THROW_ON_ERROR.
try {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'Ошибка JSON: ' . $e->getMessage();
}
Ответ API
Если PHP-скрипт возвращает JSON, нужно указать правильный заголовок Content-Type. Это помогает браузеру и внешним клиентам корректно обработать ответ.
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'success' => true,
'data' => $items,
], JSON_UNESCAPED_UNICODE);
Чтение JSON-запроса
Когда клиент отправляет JSON в теле POST-запроса, данные не появятся в $_POST. Их нужно читать из php://input.
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!is_array($data)) {
http_response_code(400);
echo json_encode(['error' => 'Некорректный JSON']);
exit;
}
Структура ответа
Хороший API возвращает предсказуемую структуру. Например: success, data, error, meta. Тогда клиенту не приходится угадывать, что пришло в ответе.
{
"success": true,
"data": [],
"meta": {
"page": 1
}
}
Безопасность
JSON не делает данные безопасными сам по себе. Всё, что приходит из API, нужно валидировать. Если данные потом выводятся в HTML, их всё равно нужно экранировать через htmlspecialchars().
Типичные ошибки
- Не указывать
Content-Type: application/json. - Ожидать JSON-данные в
$_POST. - Не проверять ошибку декодирования.
- Возвращать разные структуры ответа в разных местах API.
- Считать JSON валидацией данных.
Итоги
JSON — основной формат обмена данными в современных веб-системах. В PHP важно уверенно пользоваться json_encode(), json_decode(), проверять ошибки, читать тело запроса через php://input и возвращать предсказуемую структуру API-ответа.