Другое

Полное руководство: Определение 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.


Содержание


Базовый метод определения типа запроса

Основной и наиболее надежный способ определения типов HTTP-запросов в PHP - это использование суперглобальной переменной $_SERVER['REQUEST_METHOD']. Эта переменная содержит HTTP-метод, использованный для текущего запроса, и доступна для всех типов запросов.

php
$requestMethod = $_SERVER['REQUEST_METHOD'];

Согласно документации W3Docs, “вы можете использовать суперглобальную переменную $_SERVER['REQUEST_METHOD'] для определения типа запроса. Эта суперглобальная переменная будет содержать метод запроса, использованный клиентом, который может быть одним из GET, POST, PUT или DELETE.”

Вы можете использовать это значение в условных операторах или блоках switch для обработки разных типов запросов:

php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Обработка POST запроса
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // Обработка GET запроса
}

Обработка GET и POST запросов

Запросы GET и POST автоматически обрабатываются PHP через суперглобальные массивы, что делает их простыми в использовании:

GET запросы

Данные GET запроса доступны в суперглобальном массиве $_GET:

php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $id = $_GET['id'] ?? null;
    $name = $_GET['name'] ?? null;
    // Обработка GET параметров
}

POST запросы

Данные POST запроса доступны в суперглобальном массиве $_POST:

php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? null;
    $password = $_POST['password'] ?? null;
    // Обработка POST данных
}

Как показано в ответе на Stack Overflow, вы также можете использовать операторы switch для более чистой организации кода:

php
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 запроса

php
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, вы можете создать повторно используемую функцию для разбора входных данных:

php
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 запроса

php
if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    $rawData = file_get_contents('php://input');
    $deleteData = [];
    parse_str($rawData, $deleteData);
    
    // Теперь $deleteData содержит DELETE параметры
    $id = $deleteData['id'] ?? null;
}

Как показано в статье Medium, вы можете использовать тот же подход к разбору:

php
if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    parse_str(file_get_contents('php://input'), $_DELETE);
    $id = $_DELETE['id'] ?? null;
}

Полный пример реализации

Вот комплексный пример, демонстрирующий обработку всех четырех типов HTTP-запросов:

php
<?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-запросов, особенно из неизвестных источников, безопасность является ключевым фактором. Вот важные соображения по безопасности:

Проверка и очистка входных данных

Всегда проверяйте и очищайте входные данные для предотвращения уязвимостей безопасности:

php
// Использование 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:

php
$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:

php
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (strpos($contentType, 'application/json') !== false) {
    $jsonData = json_decode(file_get_contents('php://input'), true);
    // Обработка JSON данных
}

Источники

  1. Определение типа запроса в PHP (GET, POST, PUT или DELETE) - W3Docs
  2. PHP - определение типа HTTP-запроса в PHP (GET, POST, PUT, DELETE) - Dirask
  3. Протокол HTTP PUT и DELETE и их использование в PHP - Stack Overflow
  4. Проверка, является ли запрос GET или POST - Stack Overflow
  5. Как определить тип запроса в PHP? - Uptimeia
  6. REST API с использованием PHP (базовый GET, POST, PUT & DELETE) - Medium
  7. Доступ к входящим 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-приложениях.

Авторы
Проверено модерацией
Модерация