Полное руководство: Определение HTTP-методов в PHP
Узнайте, как определять типы HTTP-запросов (GET, POST, PUT, DELETE) в PHP с помощью $_SERVER['REQUEST_METHOD']. Полное руководство с примерами безопасной обработки всех типов запросов.
Как определить, какой тип HTTP-запроса (GET, POST, PUT или DELETE) был использован в PHP?
В PHP вы можете определить, какой тип HTTP-запроса был использован, обращаясь к суперглобальной переменной $_SERVER['REQUEST_METHOD'], которая содержит метод запроса, использованный клиентом (GET, POST, PUT или DELETE). Для PUT и DELETE запросов вам дополнительно потребуется разобрать тело запроса с помощью php://input, поскольку PHP не автоматически заполняет суперглобальные массивы для этих методов, как это делает для GET и POST.
Содержание
- Базовый метод определения типа запроса
- Обработка GET и POST запросов
- Обработка PUT запросов
- Обработка DELETE запросов
- Полный пример реализации
- Соображения по безопасности
Базовый метод определения типа запроса
Основной и наиболее надежный способ определения типов HTTP-запросов в PHP - это использование суперглобальной переменной $_SERVER['REQUEST_METHOD']. Эта переменная содержит HTTP-метод, использованный для текущего запроса, и доступна для всех типов запросов.
$requestMethod = $_SERVER['REQUEST_METHOD'];
Согласно документации W3Docs, “вы можете использовать суперглобальную переменную $_SERVER['REQUEST_METHOD'] для определения типа запроса. Эта суперглобальная переменная будет содержать метод запроса, использованный клиентом, который может быть одним из GET, POST, PUT или DELETE.”
Вы можете использовать это значение в условных операторах или блоках switch для обработки разных типов запросов:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Обработка POST запроса
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
// Обработка GET запроса
}
Обработка GET и POST запросов
Запросы GET и POST автоматически обрабатываются PHP через суперглобальные массивы, что делает их простыми в использовании:
GET запросы
Данные GET запроса доступны в суперглобальном массиве $_GET:
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$id = $_GET['id'] ?? null;
$name = $_GET['name'] ?? null;
// Обработка GET параметров
}
POST запросы
Данные POST запроса доступны в суперглобальном массиве $_POST:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? null;
$password = $_POST['password'] ?? null;
// Обработка POST данных
}
Как показано в ответе на Stack Overflow, вы также можете использовать операторы switch для более чистой организации кода:
switch ($_SERVER['REQUEST_METHOD']) {
case 'POST':
// Обработка POST
break;
case 'GET':
// Обработка GET
break;
default:
http_response_code(405);
die();
}
Обработка PUT запросов
PUT запросы требуют специальной обработки, поскольку PHP не автоматически заполняет суперглобальный массив $_PUT, как это делает для GET и POST. Вам нужно прочитать тело запроса из php://input и разобрать его вручную.
Базовая обработка PUT запроса
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
$rawData = file_get_contents('php://input');
$putData = [];
parse_str($rawData, $putData);
// Теперь $putData содержит PUT параметры
$id = $putData['id'] ?? null;
$name = $putData['name'] ?? null;
}
Как объясняется в руководстве Dirask, вы можете создать повторно используемую функцию для разбора входных данных:
function parseInput() {
$data = file_get_contents("php://input");
if($data == false) return array();
parse_str($data, $result);
return $result;
}
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
$_PUT = parseInput();
// Доступ к данным из массива $_PUT
}
Обработка DELETE запросов
DELETE запросы обрабатываются аналогично PUT запросам, поскольку PHP не автоматически их обрабатывает. Вам нужно разобрать тело запроса вручную.
Базовая обработка DELETE запроса
if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
$rawData = file_get_contents('php://input');
$deleteData = [];
parse_str($rawData, $deleteData);
// Теперь $deleteData содержит DELETE параметры
$id = $deleteData['id'] ?? null;
}
Как показано в статье Medium, вы можете использовать тот же подход к разбору:
if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
parse_str(file_get_contents('php://input'), $_DELETE);
$id = $_DELETE['id'] ?? null;
}
Полный пример реализации
Вот комплексный пример, демонстрирующий обработку всех четырех типов HTTP-запросов:
<?php
// Получаем метод запроса
$method = $_SERVER['REQUEST_METHOD'];
// Функция для разбора входных данных для PUT и DELETE
function parseInput() {
$data = file_get_contents("php://input");
if($data == false) return array();
parse_str($data, $result);
return $result;
}
// Switch на основе метода запроса
switch ($method) {
case 'GET':
echo "Метод запроса GET\n";
echo "Параметры: ";
print_r($_GET);
break;
case 'POST':
echo "Метод запроса POST\n";
echo "Параметры: ";
print_r($_POST);
break;
case 'PUT':
$_PUT = parseInput();
echo "Метод запроса PUT\n";
echo "Параметры: ";
print_r($_PUT);
break;
case 'DELETE':
$_DELETE = parseInput();
echo "Метод запроса DELETE\n";
echo "Параметры: ";
print_r($_DELETE);
break;
default:
echo "Неизвестный метод запроса: $method";
http_response_code(405);
break;
}
?>
Эта реализация, как показано в примере Dirask, предоставляет единый подход к обработке всех типов HTTP-запросов в одном скрипте.
Соображения по безопасности
При обработке HTTP-запросов, особенно из неизвестных источников, безопасность является ключевым фактором. Вот важные соображения по безопасности:
Проверка и очистка входных данных
Всегда проверяйте и очищайте входные данные для предотвращения уязвимостей безопасности:
// Использование filter_input для безопасности
$requestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
// Очистка входных данных
$sanitizedInput = filter_var_array($inputData, [
'id' => FILTER_SANITIZE_NUMBER_INT,
'name' => FILTER_SANITIZE_STRING,
]);
Как упоминается в обсуждении на Stack Overflow, “мы можем использовать input_filter для определения метода запроса, а также обеспечить безопасность через очистку входных данных.”
Обработка неизвестных методов
Правильно обрабатывайте неизвестные HTTP-методы, возвращая соответствующие коды статуса HTTP:
$allowedMethods = ['GET', 'POST', 'PUT', 'DELETE'];
if (!in_array($_SERVER['REQUEST_METHOD'], $allowedMethods)) {
http_response_code(405); // Method Not Allowed
header('Allow: ' . implode(', ', $allowedMethods));
die();
}
Проверка Content-Type
Для JSON API проверяйте заголовок Content-Type:
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (strpos($contentType, 'application/json') !== false) {
$jsonData = json_decode(file_get_contents('php://input'), true);
// Обработка JSON данных
}
Источники
- Определение типа запроса в PHP (GET, POST, PUT или DELETE) - W3Docs
- PHP - определение типа HTTP-запроса в PHP (GET, POST, PUT, DELETE) - Dirask
- Протокол HTTP PUT и DELETE и их использование в PHP - Stack Overflow
- Проверка, является ли запрос GET или POST - Stack Overflow
- Как определить тип запроса в PHP? - Uptimeia
- REST API с использованием PHP (базовый GET, POST, PUT & DELETE) - Medium
- Доступ к входящим PUT данным из PHP - LornaJane
Заключение
Определение типов HTTP-запросов в PHP является простым с использованием суперглобальной переменной $_SERVER['REQUEST_METHOD'], которая надежно определяет, является ли запрос GET, POST, PUT или DELETE. Хотя GET и POST запросы автоматически обрабатываются PHP через массивы $_GET и $_POST, для PUT и DELETE требуется ручной разбор потока php://input. Для наиболее надежных реализаций рекомендуется создавать повторно используемые функции разбора, реализовывать соответствующие меры безопасности, такие как проверка входных данных, и обрабатывать неизвестные HTTP-методы с помощью соответствующих кодов статуса. Этот подход обеспечивает прочную основу для создания RESTful API и обработки различных типов HTTP-запросов в ваших PHP-приложениях.