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

Ответ

Критерий GET POST
Назначение Получение данных с сервера. Отправка данных на сервер (часто для создания или изменения).
Данные Параметры передаются в URL (строке запроса): ?key=value&... Данные передаются в теле запроса (тело может быть любого формата: JSON, XML, form-data).
Видимость Параметры видны в адресной строке браузера. Параметры скрыты в теле запроса.
Кэширование Может кэшироваться браузером и прокси-серверами. Не кэшируется по умолчанию.
Безопасность Менее безопасен для конфиденциальных данных (логины, пароли). Более безопасен (но для полной защиты нужен HTTPS).
Идемпотентность Идемпотентен: многократный вызов не изменяет состояние сервера. Не идемпотентен: повторный вызов может создать дубликаты ресурсов.
Ограничения Ограничение длины URL (~2048 символов). Нет жестких ограничений на размер тела.

Практический пример (создание пользователя):

// НЕПРАВИЛЬНО: Использовать GET для операций, изменяющих состояние
// GET /api/users?name=John&email=john@example.com

// ПРАВИЛЬНО: Использовать POST
// POST /api/users
// Тело запроса (JSON): {"name": "John", "email": "john@example.com"}

Основное правило: GET — для чтения, POST — для создания/изменения.

Ответ 18+ 🔞

А, слушай, ну это ж классика, про которую все слышали, но половина нихуя не понимает, в чём разница! Смотри, щас разжую.

Вот представь, ты идёшь в библиотеку, блядь. GET — это когда ты подходишь к тётеньке-библиотекарше и спрашиваешь: «Можно мне, ёпта, «Муму» Тургенева?». Ты ничего не меняешь, ты просто запрос делаешь. Книгу получил — и свободен. И если ты спросишь десять раз, она тебе десять раз одно и то же скажет — идемпотентность, сука, называется. И все твои вопросы видны, как на ладони — «дайте-ка мне ещё «Камасутру» и «Справочник сантехника».

А POST — это когда ты, сука, приходишь в эту же библиотеку с пачкой своих собственных стихов, суёшь их библиотекарю в руки и говоришь: «Вот, добавьте это в ваш фонд, я новый Лев Толстой, блядь». Ты уже не просто спрашиваешь — ты отправляешь данные, ты меняешь состояние всей этой ебаной системы! Твои стихи теперь в теле запроса, их в адресной строке не разглядишь. И если ты десять раз принесёшь одни и те же стихи, у них в каталоге будет десять одинаковых папок — вот тебе и не идемпотентность, пиздец!

Критерий GET POST
Назначение Получение данных с сервера. Отправка данных на сервер (часто для создания или изменения).
Данные Параметры передаются в URL (строке запроса): ?key=value&... Данные передаются в теле запроса (тело может быть любого формата: JSON, XML, form-data).
Видимость Параметры видны в адресной строке браузера. Параметры скрыты в теле запроса.
Кэширование Может кэшироваться браузером и прокси-серверами. Не кэшируется по умолчанию.
Безопасность Менее безопасен для конфиденциальных данных (логины, пароли). Более безопасен (но для полной защиты нужен HTTPS).
Идемпотентность Идемпотентен: многократный вызов не изменяет состояние сервера. Не идемпотентен: повторный вызов может создать дубликаты ресурсов.
Ограничения Ограничение длины URL (~2048 символов). Нет жестких ограничений на размер тела.

А теперь смотри, какой бывает пиздец на практике, когда не понимают:

// НЕПРАВИЛЬНО: Использовать GET для операций, изменяющих состояние
// GET /api/users?name=John&email=john@example.com
// Это пиздец какой-то! Представь, бот или кэш начнёт по этой ссылке ходить,
// и у тебя на сервере каждый раз новый Джон будет рождаться, овердохуища клонов!

// ПРАВИЛЬНО: Использовать POST
// POST /api/users
// Тело запроса (JSON): {"name": "John", "email": "john@example.com"}
// Вот это — чистая работа. Пришёл, создал, всё в теле, красиво, безопасно.

Короче, правило простое, как хуй с горы: GET — для чтения, POST — для создания/изменения. Запомни это, и волнение ебать по поводу кривых апишек сразу спадёт.