Как в PHP получить тело PUT-запроса без использования фреймворков?

«Как в PHP получить тело PUT-запроса без использования фреймворков?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В нативном PHP данные из тела PUT (или DELETE, PATCH) запроса не помещаются автоматически в суперглобальные массивы $_POST или $_FILES. Для их чтения необходимо использовать поток php://input.

Базовый пример получения и разбора данных:

// Чтение сырых данных из тела запроса
$rawInput = file_get_contents('php://input');

// Если клиент отправил JSON
$data = json_decode($rawInput, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400); // Bad Request
    echo 'Invalid JSON';
    exit;
}

// Если клиент отправил данные в формате application/x-www-form-urlencoded
// parse_str($rawInput, $data);

// $data теперь содержит массив с переданными значениями

Критически важные детали:

  • php://input доступен только для чтения один раз. Если прочитать его дважды, второй вызов вернет пустую строку.
  • Для больших запросов стоит использовать потоковое чтение (fopen('php://input', 'r')), чтобы не загружать всё в память разом.
  • PUT-запросы не поддерживают multipart/form-data для загрузки файлов так же, как POST. Для загрузки файлов через PUT нужна нестандартная обработка сырого потока.
  • Всегда проверяйте Content-Type заголовок запроса ($_SERVER['CONTENT_TYPE']), чтобы понять, в каком формате пришли данные, и выбрать правильный метод разбора.