Ответ
HTTP-методы (или глаголы) определяют тип действия, которое клиент хочет выполнить над ресурсом на сервере. Основные различия заключаются в их семантике, идемпотентности и безопасности.
Основные HTTP-методы:
-
GET
: Запрашивает представление указанного ресурса. Используется для получения данных.- Безопасный: Не изменяет состояние сервера.
- Идемпотентный: Многократное выполнение запроса дает тот же результат, что и однократное.
- Кэшируемый: Ответы могут быть кэшированы.
- Пример: Получение списка пользователей:
GET /users
-
POST
: Отправляет данные для обработки на указанный ресурс. Используется для создания новых ресурсов или отправки данных, которые могут иметь побочные эффекты.- Небезопасный: Может изменять состояние сервера.
- Неидемпотентный: Многократное выполнение может привести к созданию нескольких ресурсов или другим побочным эффектам.
- Не кэшируемый: Ответы обычно не кэшируются.
- Пример: Создание нового пользователя:
POST /users
с телом запроса.
-
PUT
: Заменяет все текущие представления целевого ресурса данными из тела запроса. Используется для полного обновления существующего ресурса или создания нового, если он не существует.- Небезопасный: Изменяет состояние сервера.
- Идемпотентный: Многократное выполнение запроса приведет к одному и тому же конечному состоянию ресурса.
- Не кэшируемый: Ответы обычно не кэшируются.
- Пример: Обновление данных пользователя:
PUT /users/123
с полным телом пользователя.
-
DELETE
: Удаляет указанный ресурс.- Небезопасный: Изменяет состояние сервера.
- Идемпотентный: Многократное выполнение запроса приведет к одному и тому же конечному состоянию (ресурс будет удален или отсутствовать).
- Не кэшируемый: Ответы обычно не кэшируются.
- Пример: Удаление пользователя:
DELETE /users/123
-
PATCH
: Применяет частичные изменения к ресурсу. Используется для частичного обновления существующего ресурса.- Небезопасный: Изменяет состояние сервера.
- Неидемпотентный: Может быть неидемпотентным, если патч-операции не определены как идемпотентные.
- Не кэшируемый: Ответы обычно не кэшируются.
- Пример: Изменение только имени пользователя:
PATCH /users/123
с телом{ "name": "New Name" }
.
-
HEAD
: Запрашивает заголовки, которые были бы возвращеныGET
-запросом, но без тела ответа. Используется для проверки существования ресурса или получения метаданных без загрузки всего содержимого.- Безопасный: Не изменяет состояние сервера.
- Идемпотентный: Да.
- Кэшируемый: Да.
Пояснения терминов:
- Идемпотентность: Операция идемпотентна, если многократное её выполнение приводит к тому же результату, что и однократное. Например, удаление ресурса несколько раз приведет к тому, что ресурс будет удален (или отсутствовать) после первого раза, и последующие запросы не изменят это состояние.
- Безопасность: Операция считается безопасной, если она не вызывает никаких побочных эффектов на сервере, то есть не изменяет состояние ресурса.
GET
иHEAD
являются безопасными методами.
Примеры в Python с requests
:
import requests
# GET-запрос (получение данных)
response_get = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(f"GET Response: {response_get.json()['title']}")
# POST-запрос (создание данных)
new_post_data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response_post = requests.post('https://jsonplaceholder.typicode.com/posts', json=new_post_data)
print(f"POST Response Status: {response_post.status_code}, ID: {response_post.json()['id']}")
# PUT-запрос (полное обновление данных)
updated_post_data = {'id': 1, 'title': 'updated title', 'body': 'updated body', 'userId': 1}
response_put = requests.put('https://jsonplaceholder.typicode.com/posts/1', json=updated_post_data)
print(f"PUT Response Status: {response_put.status_code}")
# DELETE-запрос (удаление данных)
response_delete = requests.delete('https://jsonplaceholder.typicode.com/posts/1')
print(f"DELETE Response Status: {response_delete.status_code}")