Ответ
Основное концептуальное различие заключается в семантике операций над ресурсами в RESTful API.
POST используется для создания нового ресурса, когда его идентификатор (ID) неизвестен или определяется сервером. Клиент отправляет данные в коллекцию.
- Неидемпотентен: Повторный идентичный запрос создаст новый, дублирующий ресурс.
- Типичный статус ответа:
201 Created(с заголовкомLocation). - Целевой URI: Коллекция (например,
/users).
PUT используется для полного обновления существующего ресурса с известным идентификатором. Клиент отправляет полное представление ресурса по конкретному URI. PUT также может использоваться для создания, если клиент сам определяет ID ресурса.
- Идемпотентен: Многократное выполнение одного и того же запроса даст тот же результат (ресурс будет обновлен до одного и того же состояния).
- Типичные статусы ответа:
200 OKили204 No Content. - Целевой URI: Конкретный ресурс (например,
/users/123).
Пример на Python с библиотекой requests:
import requests
import json
# POST: Создание нового пользователя (ID назначит сервер)
new_user = {"name": "John", "email": "john@example.com"}
post_response = requests.post('https://api.example.com/users', json=new_user)
print(f"POST Status: {post_response.status_code}") # Ожидается 201
print(f"Location: {post_response.headers.get('Location')}")
# PUT: Полное обновление пользователя с ID 123
updated_user = {"id": 123, "name": "John Doe", "email": "john.doe@example.com"}
put_response = requests.put('https://api.example.com/users/123', json=updated_user)
print(f"PUT Status: {put_response.status_code}") # Ожидается 200 или 204
Для частичного обновления следует использовать метод PATCH.
Ответ 18+ 🔞
Давай разберём эту хуйню, которая всех новичков вгоняет в ступор. POST и PUT — это как два брата-близнеца, но один из них полный мудак, который плодит копии, а второй — педантичный зануда, который всё хочет контролировать.
Смотри, суть в том, куда ты тыкаешь свой запрос и что от этого получается.
POST — это как крикнуть в пустоту: «Эй, сервер, роди мне тут что-нибудь новенькое!». Ты шлёшь данные в коллекцию (/users), а сервер, ёпта, сам решает, какой ID этому детищу присвоить и куда его пристроить.
- Неидемпотентен, блядь: Это ключевое слово. На русском это значит: если ты нажмёшь F5 и отправишь тот же запрос ещё раз — родится второй такой же уёбок. Дубликат, короче. Овердохуища пользователей с именем «Вася».
- Что в ответ? В идеале —
201 Createdи ссылка в заголовкеLocation, где этого новорождённого можно найти. - Куда стучимся? В коллекцию.
/пациенты,/заказы,/котики.
PUT — это уже не роды, а капитальный ремонт. Ты приходишь к конкретному ресурсу (/users/123) и говоришь: «На, блядь, вот полный набор новых данных для этого объекта. Замени всё, что там было, на это. Точно всё».
- Идемпотентен: А вот это уже приятно. Сколько раз ни жми F5 — после первого запроса результат не изменится. Обновил и хватит. Стабильность, ебать.
- Что в ответ?
200 OKили204 No Content— типа «понял, принял, сделал, отъебись». - Особый прикол: PUT'ом можно и создать ресурс, но только если ты сам, хитрая жопа, знаешь его будущий ID и стучишься прямо по нему (
PUT /users/999). Сервер такой: «О, на/users/999ничего нет? Ну раз клиент так хочет — создам там именно это».
А теперь смотри, как это выглядит в коде, чтобы не быть тем самым мудаком, который POST'ом апдейты делает.
import requests
import json
# POST: Делаем ребёнка. Сервер даст ему имя (ID).
new_user = {"name": "John", "email": "john@example.com"}
post_response = requests.post('https://api.example.com/users', json=new_user)
print(f"POST Status: {post_response.status_code}") # Ожидается 201
print(f"Location: {post_response.headers.get('Location')}") # Адрес, где лежит младенец
# PUT: Ломаем и перестраиваем пользователя с ID 123. Всё, что было — в утиль.
updated_user = {"id": 123, "name": "John Doe", "email": "john.doe@example.com"}
put_response = requests.put('https://api.example.com/users/123', json=updated_user)
print(f"PUT Status: {put_response.status_code}") # Ожидается 200 или 204
И главное, запомни, ебушки-воробушки: если нужно поменять только одно поле (например, только имя), то это работа для PATCH, а не для PUT. PUT — это когда ты приносишь целый новый чертёж и говоришь «строй по нему, старьё — нахуй».