В чем разница между HTTP-методами GET и POST?

«В чем разница между HTTP-методами GET и POST?» — вопрос из категории Сети, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

GET и POST — это основные HTTP-методы (глаголы) с фундаментально разной семантикой согласно стандарту REST.

Критерий GET POST
Назначение Получение (Read) данных. Безопасный и идемпотентный метод. Создание (Create) или отправка данных. Не безопасный, не идемпотентный.
Данные Передаются в URL как query-параметры после ? (?key=value&...). Передаются в теле запроса (body).
Видимость Видны в адресной строке браузера, истории, логах. Скрыты в теле запроса.
Ограничения Ограничены длиной URL (зависит от браузера/сервера, ~2048 символов). Теоретически не ограничены.
Кэширование Да. Ответы могут кэшироваться браузером и прокси. Нет. По умолчанию не кэшируются.
Закладки Запрос можно добавить в закладки. Нельзя.
Повторная отправка Безопасна (идемпотентность: N одинаковых GET = 1 GET). Опасна (может создать дубликаты, например, два заказа). Браузер предупреждает.

Пример GET-запроса в Swift:

// Параметры в URL
let url = URL(string: "https://api.example.com/search?query=swift&page=1")!
var request = URLRequest(url: url)
request.httpMethod = "GET" // Указано явно (по умолчанию и так GET)

URLSession.shared.dataTask(with: request) { data, response, error in
    // Обработка ответа
}.resume()

Пример POST-запроса в Swift (с JSON):

let url = URL(string: "https://api.example.com/users")!
var request = URLRequest(url: url)
request.httpMethod = "POST"

// Устанавливаем заголовок Content-Type
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

// Подготавливаем данные для тела запроса
let body: [String: Any] = ["name": "John", "email": "john@example.com"]
request.httpBody = try? JSONSerialization.data(withJSONObject: body)

URLSession.shared.dataTask(with: request) { data, response, error in
    // Обработка ответа (например, созданного пользователя)
}.resume()

Ключевые принципы выбора:

  • Используйте GET для запросов, которые только получают данные (поиск, фильтрация, загрузка страницы).
  • Используйте POST для запросов, которые изменяют состояние на сервере (создание пользователя, отправка формы, оплата). Это важно для безопасности и корректности работы приложения.