Ответ
В нативном 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']), чтобы понять, в каком формате пришли данные, и выбрать правильный метод разбора.