Вирішено Різниця між PUT і POST

Alex Alex · 11 · 1

Соромно зізнатися, але я прочитавши багато різних статей, все одно не до кінця усвідомлюю різницю між PUT і POST

Специфікація HTTP 1.1 свідчить, що PUT ідемпотентний. Це означає, що клієнт може виконати безліч PUT запитів по одному URI і це не призведе до створення записів дублікатів. Операції присвоєння - хороший приклад Ідемпотентний операції

String userId = this.request [ "USER_ID"];

Навіть якщо цю операцію виконати двічі або тричі, ніякої шкоди не буде (крім зайвих тактів процесора). POST же з іншого боку не ідемпотентний. Це щось на зразок інкремента. Вам слід використовувати POST або PUT з урахуванням того чи виконувана дію ідемпотентна чи ні. Якщо говорити мовою програмістів, якщо клієнт знає URL об'єкта, який потрібно створити, використовуйте PUT. Якщо клієнт знає URL методу/класу створює потрібний об'єкт, використовуйте POST.

Тут наведено "хороший приклад Ідемпотентний операції String userId = this.request [" USER_ID "];". У чому приклад хороший не зрозумію? Якої шкоди може бути від цієї операції якщо ми використовуємо POST а не PUT? Був би дуже вдячний, якби мені дали простий приклад, де краще застосовувати PUT і чому.

Наприклад величезне число сервісів для завантаження файлів використовує PUT. Чим це виправдано?

Мене цікавить зокрема завантаження файлів.

Відповіді на питання

Різниця між PUT і POST - це питання семантики. Коль скоро для операцій використовуються різні дієслова, то і сенс у них повинен бути різним.

Уявіть, що ваш сервіс оперує поняттями блокнот (notebook) і запис (post). Один блокнот може містити безліч записів.

Для додавання нового запису в блокнот c ідентифікатором id ви будете використовувати метод POST з URL mydomain/notebooks/id/. Ваш сервіс, орієнтуючись на метод POST, сам присвоїть потрібний ідентифікатор запису, додасть її в блокнот і поверне вам URL створеного запису (для доступу до запису по GET або для видалення по DELETE). При цьому добре б повернути клієнту URL створеної записи.

Припустимо, запис з ідентифікатором post-id вже створено і він доступний по URL mydomain/notebooks/id/posts/post-id. Але клієнт (власник запису) виправив в ній помилку і хоче перезаписати її. Для цього він використовує метод PUT з URL mydomain/notebooks/id/posts/post-id і передає оновлений запис в тілі запиту. Ваш сервіс, орієнтуючись на метод PUT видаляє старий запис і записує новий, при цьому він доступний за тим же URL.

Звичайно, ніхто не заважає вам завжди використовувати метод POST (наприклад HTML 4 дозволяв використовувати тільки методи GET і POST). Але все ж варто дотримуватися рекомендацій з метою однакового трактування методів усіма розробниками.

Рекомендується використовуватися метод POST для створення підлеглого ресурсу (дочірнього по відношенню до іншого ресурсу; приклад блокнота і записи якраз дуже підходить).


Для відповіді на запитання необхідно авторизуватись

Війти / Зареєструватися