Что такое HTTP GET-запрос?

Ответ

GET — HTTP-метод для получения данных с сервера. Параметры передаются в URL-строке, запрос не имеет тела.

Пример на Swift с URLSession:

func fetchUserProfile(userId: Int) {
    // Параметры в URL
    let urlString = "https://api.example.com/users/(userId)?fields=name,email"
    guard let url = URL(string: urlString) else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("application/json", forHTTPHeaderField: "Accept")

    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else { return }

        // Обработка JSON-ответа
        if let json = try? JSONSerialization.jsonObject(with: data) {
            print("Получены данные: (json)")
        }
    }.resume()
}

Характеристики GET-запроса:

  • Идемпотентный — повторные запросы не изменяют состояние сервера
  • Кэшируемый — ответы могут кэшироваться браузером/CDN
  • Ограниченная длина — параметры в URL ограничены ~2000 символов
  • Видимый — параметры отображаются в истории браузера, логах

Когда использовать: ✅ Получение данных (списки, детали) ✅ Поиск с фильтрами (параметры в URL) ✅ Статические ресурсы (изображения, CSS)

Когда НЕ использовать: ❌ Передача чувствительных данных (пароли, токены) ❌ Большие объёмы данных (используйте POST с телом) ❌ Операции изменения состояния (используйте POST/PUT/DELETE)

Ответ 18+ 🔞

А, слушай, вот этот твой GET-запрос, блядь! Это ж как в магазин сходить, понимаешь? Пришёл, посмотрел на полки, хуй взял — и домой. Ничего не трогаешь, ничего не ломаешь, просто смотришь, что есть.

Вот смотри, на Swift'е это выглядит примерно так, ёпта:

func fetchUserProfile(userId: Int) {
    // Параметры в URL
    let urlString = "https://api.example.com/users/(userId)?fields=name,email"
    guard let url = URL(string: urlString) else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("application/json", forHTTPHeaderField: "Accept")

    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else { return }

        // Обработка JSON-ответа
        if let json = try? JSONSerialization.jsonObject(with: data) {
            print("Получены данные: (json)")
        }
    }.resume()
}

Видишь? Никакого тела запроса, сука! Всё в адресной строке, как в старые добрые времена, когда порно искали по прямым ссылкам, блядь.

А теперь про особенности, в рот меня чих-пых:

Идемпотентный — это значит, что сколько раз ни тыкай — хуй сломаешь. Десять раз запросил профиль — десять раз получил одно и то же. Сервер не охуевает от твоих запросов.

Кэшируемый — браузер или прокси могут запомнить ответ и в следующий раз не дергать сервер, а отдать из кэша. Экономия, блядь, трафика!

Ограниченная длина — ну, потому что URL не резиновый, ёпта. Больше пары тысяч символов — и пошло-поехало, обрезка, ошибки. Не надо туда всю «Войну и мир» пихать!

Видимый — это вообще песня! Все параметры торчат в адресной строке, как хуй из штанов. История браузера, логи сервера — всё видят, что ты там искал. Хуй скроешь!

Когда его юзать, а когда — нет:

Можно, когда просто получаешь данные: список товаров, профиль юзера, поиск с фильтрами (фильтры — в URL, как GET-параметры). Или статику: картинки, стили.

Нельзя, блядь, когда передаёшь секреты: пароли, токены. Все увидят! Или когда данных дохуя — лучше POST с телом. И уж точно не для изменений на сервере! Не GET'ом удалять или обновлять, а то потом будешь охуевать, почему всё сломалось.

Короче, GET — это как вежливо спросить: «Можно я посмотрю?». А не как вломиться в дом с криком «Щас всё перевернём!».