Різниця між PUT і POST
Соромно зізнатися, але я прочитавши багато різних статей, все одно не до кінця усвідомлюю різницю між 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. Чим це виправдано?
Мене цікавить зокрема завантаження файлів.
Відповіді на питання (1)
Різниця між 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 для створення підлеглого ресурсу (дочірнього по відношенню до іншого ресурсу; приклад блокнота і записи якраз дуже підходить).