Для чего используется метод GET в HTTP

Ответ

Метод GET в HTTP я использую для идемпотентных операций получения данных, которые не изменяют состояние сервера. Это фундаментальный принцип RESTful API и веб-разработки.

Правильное использование в PHP-приложениях:

// Контроллер для получения списка пользователей с фильтрацией
public function listUsers(Request $request): JsonResponse
{
    // Валидация и санитизация GET-параметров
    $page = filter_var(
        $request->query->get('page', 1), 
        FILTER_VALIDATE_INT, 
        ['options' => ['min_range' => 1, 'default' => 1]]
    );

    $limit = filter_var(
        $request->query->get('limit', 20),
        FILTER_VALIDATE_INT,
        ['options' => ['min_range' => 1, 'max_range' => 100, 'default' => 20]]
    );

    $search = htmlspecialchars(
        $request->query->get('search', ''),
        ENT_QUOTES,
        'UTF-8'
    );

    // Использование в запросе
    $users = $this->userRepository->findPaginated(
        page: $page,
        limit: $limit,
        searchTerm: $search
    );

    return new JsonResponse([
        'data' => $users,
        'meta' => [
            'page' => $page,
            'limit' => $limit,
            'total' => count($users)
        ]
    ]);
}

Ключевые характеристики GET-запросов:

  1. Идемпотентность — многократные одинаковые запросы дают одинаковый результат
  2. Кэшируемость — ответы можно кэшировать на разных уровнях (браузер, CDN, прокси)
  3. Закладки и обмен — URL с GET-параметрами можно сохранять и передавать
  4. Ограничения:
    • Данные в URL (макс ~2000 символов)
    • Параметры видны в истории браузера и логах
    • Не для конфиденциальных данных

Безопасная работа с $_GET:

// НИКОГДА не доверяйте данным из $_GET
$unsafeId = $_GET['id'] ?? '';

// Всегда валидируйте и экранируйте
$id = (int) filter_var($unsafeId, FILTER_VALIDATE_INT);
if ($id <= 0) {
    throw new InvalidArgumentException('Invalid ID');
}

// Для строковых параметров
$query = isset($_GET['q']) 
    ? htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8')
    : '';

Типичные сценарии:

  • Постраничная навигация (?page=2&limit=20)
  • Фильтрация и сортировка (?sort=name&order=asc)
  • Поиск (?q=keyword)
  • Получение ресурсов по ID (/api/users/123)

Ответ 18+ 🔞

Да ты послушай, какой тут забавный момент про HTTP-методы вырисовывается. Метод GET — это как будто ты заходишь в библиотеку и просто смотришь на полки. Ты ничего не переставляешь, не рвёшь страницы, не пишешь свои стихи на полях. Просто смотришь. Это и есть та самая идемпотентность, ёпта. Сколько раз ни приди — полки на месте, книги те же. Сервер после такого запроса должен остаться таким же девственно чистым, как и был, в рот меня чих-пых.

Вот смотри, как это в нормальном PHP-приложении должно выглядеть, чтобы не было потом волнения ебать:

// Контроллер для получения списка пользователей с фильтрацией
public function listUsers(Request $request): JsonResponse
{
    // Валидация и санитизация GET-параметров
    $page = filter_var(
        $request->query->get('page', 1), 
        FILTER_VALIDATE_INT, 
        ['options' => ['min_range' => 1, 'default' => 1]]
    );

    $limit = filter_var(
        $request->query->get('limit', 20),
        FILTER_VALIDATE_INT,
        ['options' => ['min_range' => 1, 'max_range' => 100, 'default' => 20]]
    );

    $search = htmlspecialchars(
        $request->query->get('search', ''),
        ENT_QUOTES,
        'UTF-8'
    );

    // Использование в запросе
    $users = $this->userRepository->findPaginated(
        page: $page,
        limit: $limit,
        searchTerm: $search
    );

    return new JsonResponse([
        'data' => $users,
        'meta' => [
            'page' => $page,
            'limit' => $limit,
            'total' => count($users)
        ]
    ]);
}

Видишь, какая красота? Никаких изменяющих операций, просто читаем, фильтруем, отдаём. А теперь запомни раз и навсегда, чувак, главные фишки GET-запросов:

  1. Идемпотентность — это святое. Десять раз шлёшь один запрос — десять раз получаешь одинаковый ответ, если данные не поменялись, конечно. Никаких побочных эффектов.
  2. Кэшируемость — ответ можно засунуть в кэш, и потом отдавать из него, не дергая сервер. Браузер, CDN, прокси — все рады, трафик экономится.
  3. Закладки и обмен — всю эту хуйню с параметрами в URL можно сохранить в закладки или скинуть другу. Откроет — увидит то же самое.
  4. Ограничения, блядь — вот тут важно:
    • Данные таскаются в URL, а там не резиновый, символов 2000 от силы.
    • Всё, что в параметрах, светится в истории браузера и в логах сервера. Так что пароли или номер карты туда пихать — это чистой воды пидарас шерстяной.
    • Соответственно, для секретных данных он не годится.

И вот теперь самый важный момент, а то у некоторых доверия ебать ноль к данным извне. Работа с $_GET:

// НИКОГДА, слышишь, НИКОГДА не верь данным из $_GET слепо
$unsafeId = $_GET['id'] ?? '';

// Всегда, блядь, валидируй и экранируй, как будто тебе прислал их лично враг
$id = (int) filter_var($unsafeId, FILTER_VALIDATE_INT);
if ($id <= 0) {
    throw new InvalidArgumentException('Invalid ID');
}

// Для строк — так же жёстко
$query = isset($_GET['q']) 
    ? htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8')
    : '';

Не сделаешь так — получишь SQL-инъекцию или XSS, и будет тебе не хиросима, а настоящий нигерсраки в продакшене.

Ну и где это всё применяется? Да везде, ебать копать:

  • Листаешь ленту — ?page=2&limit=20
  • Сортируешь товары по цене — ?sort=price&order=asc
  • Ищешь кота в интернете — ?q=милый+кот
  • Получаешь инфу о пользователе — /api/users/123

Короче, запомни: GET — для того, чтобы брать, а не класть. Не усложняй, и всё будет пизда рулю.