Какие основные HTTP методы и их характеристики?

Ответ

Основные HTTP методы, их назначение и свойства:

Безопасные (не изменяют состояние сервера):

  • GET — запрос данных. Идемпотентный.
  • HEAD — аналогичен GET, но возвращает только заголовки. Идемпотентный.
  • OPTIONS — запрос поддерживаемых методов для ресурса. Идемпотентный.

Небезопасные (изменяют состояние):

  • POST — создание ресурса. Не идемпотентный.
  • PUT — полное обновление или создание ресурса с известным URI. Идемпотентный.
  • PATCH — частичное обновление ресурса. Не идемпотентный.
  • DELETE — удаление ресурса. Идемпотентный.

Почему важно различать идемпотентность? Повторный вызов идемпотентного метода (GET, PUT, DELETE) не должен приводить к разным результатам на стороне сервера. Это критично для надежности и автоматических повторов запросов.

Пример на Swift (URLSession):

let url = URL(string: "https://api.example.com/users/1")!
var request = URLRequest(url: url)
request.httpMethod = "PUT" // Идемпотентное обновление
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let userData = ["name": "Alice"]
request.httpBody = try? JSONSerialization.data(withJSONObject: userData)

Ответ 18+ 🔞

А, слушай, смотри, про эти ваши HTTP-методы, блядь. Ну, это ж как кнопки на пульте, только для сервера, понимаешь? Одни безопасные, как бабушкин сервиз — потрогал, посмотрел, на место поставил. Другие — небезопасные, тут уже можно всё разъебать, если неаккуратно.

Вот, смотри, безопасные, они состояние сервера не меняют, ну, в теории. Хуй с ним, что логи пишутся, мы про бизнес-логику говорим.

  • GET — это типа «дай-ка посмотреть». Идемпотентный, то есть сколько раз ни тыкай — фотка одна и та же будет. «Покажи мне котиков» — раз, два, десять. Котики те же, новые не родятся.
  • HEAD — тот же самый GET, но такой стеснительный, ёпта. Только шапку (заголовки) показывает, а тело ответа — ни-ни. Тоже идемпотентный. «А есть ли у тебя котики?» — «Да, есть, 10 килобайт». А самих котиков не присылает, хитрая жопа.
  • OPTIONS — ну это вообще вопрошатель. «А что с этим URL-ом можно делать-то?» Идемпотентный, да.

А вот дальше начинается настоящая, блядь, магия, где можно всё наебнуть.

  • POST — это «роди мне что-нибудь новенькое». Создание. Не идемпотентный он, сука! Нажал раз — родился пользователь «Вася». Нажал второй раз — родился ещё один «Вася», с таким же именем, но другим ID, пиздец. Автоматом повторять его нельзя, а то овердохуища Васиных клонов будет.
  • PUT — «сделай вот так, и чтоб было именно так!» Полное обновление или создание, если сам знаешь, куда положить. Идемпотентный, красава! Дёрнул раз — у пользователя с ID=1 имя стало «Алиса». Дёрнул сто раз — имя всё равно «Алиса», хуй с горы, не «Алиса-Алиса-Алиса».
  • PATCH — «подрихтуй там чутка». Частичное обновление. Не идемпотентный, подлянка! Можешь отправить «увеличить счётчик на 1». Раз отправил — стало 101. Два отправил — стало 102. Вот и вся, блядь, идемпотентность, в рот меня чих-пых!
  • DELETE — «сотри это нахуй». Идемпотентный. Удалил пользователя — его нет. Удалил его второй раз — его всё равно нет, не воскрес же он, ёпта.

И вот эта вся хуйня с идемпотентностью — это не просто так, для загадочности. Это, блядь, фундаментально! Сеть — она нестабильная сука. Запрос может потеряться. Клиент может послать повтор. Если метод идемпотентный — похуй, шлёшь повтор, и ничего страшного. А если нет, как POST — тут уже надо думать, бошка, а то вместо одного заказа три сделаешь, и тебе потом менеджер ебальник набьёт.

Ну и вот, смотри, как это на Swift выглядит, там где можно накосячить:

let url = URL(string: "https://api.example.com/users/1")!
var request = URLRequest(url: url)
request.httpMethod = "PUT" // Идемпотентное обновление
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let userData = ["name": "Alice"]
request.httpBody = try? JSONSerialization.data(withJSONObject: userData)

Видишь? PUT. Идемпотентный. Отправляй хоть сто раз — у юзера №1 будет имя «Alice». Не «AliceAliceAlice». Красота, блядь. Вот на этом и держится надёжность, а не на молитвах, ебать мои старые костыли.