← Назад к вопросам

Что можно передавать в запросе?

1.2 Junior🔥 221 комментариев
#API и веб-протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что можно передавать в HTTP запросе

В контексте PHP Backend разработки, клиент может передавать данные в HTTP запросе через несколько основных механизмов, которые определяются структурой самого HTTP протокола и его спецификациями. Эти данные являются основным источником информации для серверной логики.

Основные места передачи данных в запросе

1. URL и его компоненты

  • Параметры пути (Path Parameters): Часть самого URL пути, часто используемая в REST API для идентификации ресурсов.
    // Пример URL: /api/users/123
    // В роутере (например, Slim Framework) можно получить значение
    $userId = $request->getAttribute('routeParams')['id']; // 123
    
  • Query String (GET параметры): Данные, добавляемые в URL после символа ?. Они автоматически доступны в PHP через суперглобальный массив $_GET.
    // Пример URL: /search?q=php&page=2
    $searchTerm = $_GET['q'];   // 'php'
    $pageNumber = $_GET['page']; // 2
    

2. Тело запроса (Request Body)

Это основное место для передачи больших или сложных данных, особенно в методах POST, PUT, PATCH. Способ интерпретации тела зависит от его Content-Type.

  • application/x-www-form-urlencoded: Традиционный формат для HTML форм. Данные доступны в $_POST.
    // Данные формы: name=John&age=30
    $name = $_POST['name'];
    
  • multipart/form-data: Используется для отправки файлов вместе с данными формы. Также попадает в $_POST и $_FILES.
    $uploadedFile = $_FILES['document']['tmp_name'];
    
  • application/json: Наиболее распространенный формат для современных API. Требует парсинга в PHP.
    $jsonData = file_get_contents('php://input');
    $dataArray = json_decode($jsonData, true);
    $userEmail = $dataArray['email'];
    
  • text/plain, application/xml, другие: Специализированные форматы, которые также читаются через php://input.

3. HTTP заголовки (Headers)

Заголовки передают мета-информацию о запросе, клиенте или данных. Они доступны через суперглобальный массив $_SERVER или специальные методы в фреймворках.

  • Авторизация: Например, Authorization: Bearer <JWT_Token>.
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'];
    
  • Клиентская информация: User-Agent, Accept-Language.
  • Контроль содержимого: Content-Type (уже упомянут), Content-Length.
  • Куки (Cookies): Передаются в заголовке Cookie и доступны в PHP через $_COOKIE.
    $sessionId = $_COOKIE['PHPSESSID'];
    

Как PHP Backend обрабатывает эти данные

Важно понимать, что работа с этими данными в PHP требует строгой валидации и санитайзации, так как все они поступают от внешнего, потенциально недоверенного клиента.

Ключевые шаги обработки:

  1. Извлечение: Получение данных из соответствующих источников ($_GET, $_POST, php://input, $_SERVER).
  2. Валидация: Проверка корректности типа, формата, длины и диапазона значений.
    // Пример базовой валидации ID из query string
    $id = $_GET['id'];
    if (!filter_var($id, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]])) {
        throw new InvalidArgumentException('Invalid ID');
    }
    
  3. Санитайзация (Очистка): Особенно критично для данных, которые будут использоваться в SQL запросах или выводиться в HTML. Никогда не доверяйте сырым пользовательским данным!
    // Для SQL - используем подготовленные выражения (Prepared Statements)
    $stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
    $stmt->execute([$userEmail]); // Данные безопасно подставляются
    
    // Для HTML - применяем экранирование
    $safeOutput = htmlspecialchars($userName, ENT_QUOTES, 'UTF-8');
    

Технические детали и особенности

  • php://input — это поток, содержащий тело сырого запроса. Он может быть прочитан только один раз. После чтения $_POST автоматически заполняется (для соответствующих Content-Type), но php://input становится недоступен.
  • В случае multipart/form-data данные формы и файлы разделяются. Данные формы попадают в $_POST, а информация о файлах (временное имя, размер, тип) — в массив $_FILES. Сами файловые содержимые хранятся во временной директории сервера.
  • Для работы с JSON в современных фреймворках (Symfony, Laravel) процесс часто абстрагирован: фреймворк автоматически парсит тело запроса в объект или массив на основе заголовка Content-Type, и вы получаете уже готовые, валидированные данные через объект Request.

Таким образом, в запросе можно передавать данные через URL (параметры пути и query string), тело запроса в различных форматах (JSON, форма, файлы) и HTTP заголовки (включая куки). Задача backend разработчика — корректно извлечь эти данные из соответствующих источников, подвергнуть их строгой проверке и очистке, и только затем использовать в бизнес-логике приложения. Прямой доступ к суперглобальным массивам без обработки является одной из самых распространенных и серьезных ошибок, ведущих к уязвимости приложения.

Что можно передавать в запросе? | PrepBro