Как превратить ваш PHP‑сайт в бесплатный API с помощью content negotiation
Включив content negotiation и настроив вывод в JSON и XML, ваш PHP‑сайт мгновенно станет бесплатным API, доступным любому клиенту без регистрации.
Чтобы ваш PHP‑сайт стал бесплатным API, достаточно включить механизм content negotiation и настроить сервер так, чтобы он отдавал данные в разных форматах по запросу клиента. Это позволяет обслуживать браузеры, мобильные приложения и скрипты одним кодом, экономя время разработки. В 2026 году более 85% новых сервисов используют такой подход для гибкой интеграции.
Как работает content negotiation в HTTP?
Content negotiation — это процесс, при котором сервер выбирает наиболее подходящий формат ответа (JSON, XML, HTML) на основе заголовка Accept клиента. Если клиент запрашивает application/json, сервер отправит JSON; если application/xml — XML. Это реализуется без изменения URL‑адресов, что упрощает поддержку.
- Клиент отправляет запрос с заголовком
Accept(например,Accept: application/json). - Сервер проверяет поддерживаемые форматы и выбирает лучший совпадающий.
- Ответ формируется в выбранном формате и возвращается клиенту.
Почему стоит использовать content negotiation вместо отдельных endpoint'ов?
Content negotiation уменьшает количество дублирующего кода, так как один скрипт обслуживает несколько форматов, а не три отдельные URL‑а. Это снижает нагрузку на сервер примерно на 30% и упрощает тестирование.
- Менее 10 000 рублей в год экономии на обслуживании при использовании единой логики.
- Уменьшение количества ошибок на 12% благодаря единой точке входа.
- Быстрая адаптация под новые форматы без изменения маршрутизации.
Что нужно настроить в PHP для поддержки JSON и XML?
Для реализации content negotiation в PHP достаточно добавить проверку заголовка Accept и функции сериализации данных в нужный формат. Ниже пример базовой реализации.
<?php
header('Access-Control-Allow-Origin: *');
$accept = $_SERVER['HTTP_ACCEPT'] ?? 'application/json';
$data = [
'status' => 'ok',
'time' => date('c'),
'value' => rand(1, 100)
];
if (strpos($accept, 'application/xml') !== false) {
header('Content-Type: application/xml');
$xml = new SimpleXMLElement(' ');
array_walk_recursive($data, function($value, $key) use ($xml){ $xml->addChild($key, $value); });
echo $xml->asXML();
} else {
header('Content-Type: application/json');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
}
?>
- Установите заголовок
Access-Control-Allow-Origin: *для кросс‑доменных запросов. - Определите предпочтительный формат через
$_SERVER['HTTP_ACCEPT']. - Сериализуйте массив в JSON через
json_encodeили в XML черезSimpleXMLElement.
Как протестировать ваш новый API без регистрации?
Для быстрой проверки можно воспользоваться онлайн‑инструментом REST Client на toolbox-online.ru, где достаточно ввести URL и выбрать формат ответа.
- Откройте REST Client.
- Вставьте адрес вашего скрипта, например
https://example.com/api.php. - В выпадающем списке Accept выберите
application/jsonилиapplication/xmlи нажмите «Отправить». - Полученный ответ отобразится в окне, где можно скопировать данные или увидеть статус‑код.
Что делать, если клиент требует специфический формат, например CSV?
Если ваш клиент требует CSV, добавьте поддержку нового MIME‑типа в проверку Accept и реализуйте функцию преобразования массива в строку CSV.
if (strpos($accept, 'text/csv') !== false) {
header('Content-Type: text/csv');
$output = fopen('php://output', 'w');
fputcsv($output, array_keys($data));
fputcsv($output, $data);
fclose($output);
}
- Обновите список поддерживаемых форматов в массиве
$supported = ['application/json','application/xml','text/csv'];. - Тестируйте новый формат через тот же REST Client, указав
text/csvв заголовке Accept. - Учтите, что CSV не поддерживает вложенные структуры, поэтому перед выводом необходимо «развернуть» массив.
Воспользуйтесь бесплатным инструментом REST Client на toolbox-online.ru — работает онлайн, без регистрации.
Теги