В чем различия между основными HTTP-методами запросов?

Ответ

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