Какие основные HTTP методы используются в REST API и для чего?

Ответ

HTTP-методы (или «глаголы») определяют операцию, которую клиент хочет выполнить над ресурсом, идентифицируемым URL.

Метод Идемпотентен? Безопасен? Назначение Пример (RESTful-стиль)
GET Да Да Получение данных о ресурсе. Не должен изменять состояние сервера. GET /api/users – получить список пользователей.
POST Нет Нет Создание нового ресурса. Тело запроса содержит данные для создания. POST /api/users – создать нового пользователя.
PUT Да Нет Полное обновление ресурса. Тело запроса содержит новое представление ресурса. PUT /api/users/123 – заменить все данные пользователя с id=123.
PATCH Нет Нет Частичное обновление ресурса. Тело запроса содержит только изменяемые поля. PATCH /api/users/123 – обновить только email пользователя.
DELETE Да Нет Удаление указанного ресурса. DELETE /api/users/123 – удалить пользователя с id=123.
HEAD Да Да Как GET, но без тела ответа. Используется для получения метаданных (заголовков). HEAD /api/users – проверить существование и размер ресурса.
OPTIONS Да Да Определение поддерживаемых методов и политик CORS для ресурса. OPTIONS /api/users – узнать, можно ли делать POST запрос.

Пояснение терминов:

  • Идемпотентность: Многократное выполнение одного и того же запроса даёт идентичный результат (как у PUT, DELETE). POST не идемпотентен — два одинаковых запроса создадут два ресурса.
  • Безопасность: Метод не изменяет состояние сервера (только GET, HEAD, OPTIONS).

Пример использования с библиотекой requests:

import requests
import json

# GET
users = requests.get('https://api.example.com/users').json()

# POST
new_user = {'name': 'John'}
response = requests.post('https://api.example.com/users', json=new_user)
created_id = response.json()['id']

# PUT
update_data = {'name': 'John', 'email': 'new@mail.com'}
requests.put(f'https://api.example.com/users/{created_id}', json=update_data)

# DELETE
requests.delete(f'https://api.example.com/users/{created_id}')

Ответ 18+ 🔞

А, слушай, про эти ваши HTTP-методы, ну, про глаголы, блядь! Это ж как команды для сервера, типа "эй, чувак, сделай вот это с той штукой, на которую ссылка ведёт". Просто, казалось бы, но тут свои тонкости, ёпта.

Вот смотри, таблица, блядь, наглядная, чтобы не путаться. Главное — запомнить, кто что делает и какие у них повадки.

Метод Идемпотентен? Безопасен? Назначение Пример (RESTful-стиль)
GET Да Да Получение данных о ресурсе. Не должен изменять состояние сервера. GET /api/users – получить список пользователей.
POST Нет Нет Создание нового ресурса. Тело запроса содержит данные для создания. POST /api/users – создать нового пользователя.
PUT Да Нет Полное обновление ресурса. Тело запроса содержит новое представление ресурса. PUT /api/users/123 – заменить все данные пользователя с id=123.
PATCH Нет Нет Частичное обновление ресурса. Тело запроса содержит только изменяемые поля. PATCH /api/users/123 – обновить только email пользователя.
DELETE Да Нет Удаление указанного ресурса. DELETE /api/users/123 – удалить пользователя с id=123.
HEAD Да Да Как GET, но без тела ответа. Используется для получения метаданных (заголовков). HEAD /api/users – проверить существование и размер ресурса.
OPTIONS Да Да Определение поддерживаемых методов и политик CORS для ресурса. OPTIONS /api/users – узнать, можно ли делать POST запрос.

А теперь, сука, расшифровка для тех, кто в танке:

  • Идемпотентность: Это когда ты можешь тыкать в кнопку сто раз, а результат будет как от одного нажатия. Ну, типа, удалил запись — она удалилась. Ещё раз нажал DELETE на ту же запись — она уже удалена, хуй с горы, ничего не происходит. А вот POST — не идемпотентный, нажмёшь два раза — получишь двух одинаковых пользователей, и потом будешь ебаться, кто из них настоящий.
  • Безопасность: Это вообще про то, чтобы сервер не трогать. Типа, пришёл, посмотрел (GET), ушёл. Ничего не сломал, не создал, не удалил. Чисто почитать.

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

import requests
import json

# GET
users = requests.get('https://api.example.com/users').json()

# POST
new_user = {'name': 'John'}
response = requests.post('https://api.example.com/users', json=new_user)
created_id = response.json()['id']

# PUT
update_data = {'name': 'John', 'email': 'new@mail.com'}
requests.put(f'https://api.example.com/users/{created_id}', json=update_data)

# DELETE
requests.delete(f'https://api.example.com/users/{created_id}')

Вот и вся магия. Главное — не путай PUT с PATCH, а то вместо смены почты весь профиль пользователя в пизду угробишь. А POST используй для создания, а не для всего подряд, как некоторые распиздяи.