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

«Какие основные HTTP методы используются в REST API и для чего?» — вопрос из категории HTTP и веб-протоколы, который задают на 35% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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}')