КаталогBuilderPHPDocs

Глава 16. JSON, API и обмен данными в PHP

JSON стал стандартным форматом обмена данными между сайтами, мобильными приложениями, внешними сервисами и API. В PHP с JSON работают при интеграции с Telegram, платежными системами, CRM, интернет-магазинами, JavaScript-приложениями и внутренними сервисами.

Современное примечание. В старых проектах часто использовались XML или самодельные текстовые форматы. XML до сих пор нужен в импорте товаров и документах, но для API и веб-интерфейсов JSON обычно проще и удобнее.

Преобразование массива в 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-ответа.