Что такое формат запросов в веб-приложениях?

Ответ

Формат запроса в веб-приложении определяет структуру и способ передачи данных от клиента (браузера, мобильного приложения) к серверу. Он состоит из нескольких взаимосвязанных частей:

  1. HTTP-метод (Verb): Определяет намерение операции.

    • GET — получение ресурса. Параметры передаются в URL (query string).
    • POST — создание ресурса или отправка данных. Данные передаются в теле запроса.
    • PUT / PATCH — полное или частичное обновление ресурса.
    • DELETE — удаление ресурса.
  2. Заголовки (Headers): Мета-информация. Ключевой для формата — Content-Type.

    • application/x-www-form-urlencoded — стандартные HTML-формы.
    • multipart/form-data — формы с загрузкой файлов.
    • application/json — обмен данными в формате JSON (стандарт для REST API).
    • application/xml / text/xml — обмен в формате XML.
  3. Тело запроса (Body): Содержит сами данные в формате, указанном в Content-Type.

Пример POST-запроса с JSON и обработка на PHP:

// Клиентский код (JavaScript)
fetch('https://api.example.com/users', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + token
    },
    body: JSON.stringify({
        name: 'Alice',
        email: 'alice@example.com',
        active: true
    })
});

// Обработка на сервере (PHP)
// 1. Проверяем метод и заголовок
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405); // Method Not Allowed
    exit;
}

$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (stripos($contentType, 'application/json') === false) {
    http_response_code(415); // Unsupported Media Type
    echo json_encode(['error' => 'Expecting JSON data']);
    exit;
}

// 2. Получаем и декодируем тело запроса
$jsonInput = file_get_contents('php://input');
$data = json_decode($jsonInput, true); // Преобразуем в ассоциативный массив

if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400); // Bad Request
    echo json_encode(['error' => 'Invalid JSON']);
    exit;
}

// 3. Используем данные (валидация, сохранение в БД и т.д.)
// $data['name'], $data['email'], $data['active']

Популярные архитектурные стили, определяющие форматы запросов и ответов: REST (на основе HTTP-методов и ресурсов), GraphQL (единая endpoint, гибкий язык запросов), gRPC (бинарный протокол на основе HTTP/2).

Ответ 18+ 🔞

Давай разберём, как эти ваши запросы в веб-приложениях работают, а то у некоторых тут волнение ебать, а понимания — ноль. Представь, что твой браузер — это такой наглый курьер, который прибегает к серверу и орет ему в лицо, чего он хочет. А формат запроса — это как раз инструкция, как правильно орать, чтобы тебя поняли, а не послали нахуй с ошибкой 400 Bad Request.

Вот из чего эта инструкция состоит, ёпта:

  1. HTTP-метод (или Глагол). Это базовый крик, который определяет, что ты вообще пришел делать.

    • GET — это как прийти и сказать: «Дай!». Параметры обычно тыкают прямо в адресную строку, как записку в руку.
    • POST — это уже: «На, держи, создай что-нибудь из этого!». Данные тут передаются в теле, то есть курьер достает их из сумки.
    • PUT / PATCH — «Эй, переделай вот эту штуку!» Полностью или только кусочек.
    • DELETE — самый простой и радикальный: «Удали это нахуй».
  2. Заголовки (Headers). Это такая дополнительная мета-инфа, шепотом на ушко. Самый главный для нас — Content-Type. Он говорит серверу: «Слушай, чувак, данные в теле у меня вот в таком формате, не охуей, когда будешь читать».

    • application/x-www-form-urlencoded — старые добрые HTML-формы, как будто на дворе 2002-й год.
    • multipart/form-data — когда вместе с текстом ты пытаешься запихнуть в запрос файл (картинку, документ). Это уже посерьёзнее.
    • application/json — святое писание для современных REST API. Всё структурированно, красиво, машиночитаемо.
    • application/xml — ну, это для любителей страдать хернёй и писать в десять раз больше тегов, чем нужно.
  3. Тело запроса (Body). Ну, собственно, сами данные, которые ты передаёшь. То, что лежит в той самой сумке у курьера. Формат тела должен строго совпадать с тем, что ты объявил в Content-Type, иначе сервер просто обосрётся и ничего не поймёт.

Вот смотри, как это выглядит вживую. Пример, когда фронтенд шлёт JSON, а бэкенд на PHP его пытается принять, не сломавшись:

// Это фронтенд (например, JavaScript) делает запрос
fetch('https://api.example.com/users', {
    method: 'POST', // Кричим "СОЗДАЙ!"
    headers: { // Шепчем на ушко
        'Content-Type': 'application/json', // "Данные в теле — JSON, чувак!"
        'Authorization': 'Bearer ' + token // "Я свой, вот пропуск"
    },
    body: JSON.stringify({ // А вот и сама сумка с данными
        name: 'Alice',
        email: 'alice@example.com',
        active: true
    })
});

// А это уже серверная сторона (PHP) пытается это всё осмыслить
// 1. Первым делом проверяем, а тот ли метод к нам приперся
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405); // Method Not Allowed - "Мы так не работаем!"
    exit;
}

// 2. Смотрим, а тот ли формат данных нам суют
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (stripos($contentType, 'application/json') === false) {
    http_response_code(415); // Unsupported Media Type - "Чё это за хрень? Ждали JSON!"
    echo json_encode(['error' => 'Expecting JSON data']);
    exit;
}

// 3. Если всё ок, вытаскиваем данные из "тела" запроса
$jsonInput = file_get_contents('php://input'); // Достаём из сумки непонятную бумажку
$data = json_decode($jsonInput, true); // Пытаемся расшифровать её как JSON

// 4. Если расшифровать не вышло — кричим, что клиент идиот
if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400); // Bad Request - "Ты мне какую-то хуйню прислал, это не JSON!"
    echo json_encode(['error' => 'Invalid JSON']);
    exit;
}

// 5. Ура! Если дошли сюда, то в $data лежит нормальный массив с данными.
// Теперь можно их проверять, пихать в базу и т.д.
// $data['name'], $data['email'], $data['active']

А вообще, есть целые архитектурные стили, которые диктуют, как эти запросы должны выглядеть. REST — это классика, где всё крутится вокруг ресурсов и HTTP-методов. GraphQL — это такой хитрожопый подход, где вместо кучи разных endpoint'ов есть один, но ты можешь запросить у него ровно то, что тебе нужно, целым специальным языком. gRPC — это вообще тёмная магия, бинарный протокол поверх HTTP/2, быстрый, но там уже своя каша. В общем, выбирай, что душе угодно, главное — не путай GET с POST, а то будет вам хиросима.