RESTful - Що має містити тіло відповіді DELETE


80

Скажімо, у мене є API, куди ви можете залучити користувачів:

GET /RESTAPI/user/

А видалити користувачів можна:

DELETE /RESTAPI/user/123

Яка домовленість RESTful щодо того, що повинен містити орган відповіді DELETE? Я очікував, що це повинен бути новий список усіх користувачів, який тепер більше не містить користувача з ідентифікатором 123.

Погугливши навколо, я не отримав задоволення. Я знайшов лише думки про те, як це зробити, але чи не існує чіткого визначення RESTful Services ?

Це НЕ дублікат того, що повинен повертати RESTful API POST / DELETE в тілі? та Які виклики REST PUT / POST / DELETE повинні повертати за домовленістю? оскільки ці запитання вимагають чіткого визначення щодо ВИДАЛЕННЯ. На ці запитання відповідали лише вільні думки.

Відповіді:


81

Причина, по якій ви не отримаєте твердих відповідей, полягає в тому, що не існує жорсткого стандарту RESTful. Тож я можу лише запропонувати вам створити жорсткий стандарт і дотримуватися його у своїх власних API

Я використав це як керівництво для послуг RESTful http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

Там написано відповідь із статусом 204 та порожнім тілом

Я дотримуюся цих стандартів і добре їх документую для всіх, хто хоче використовувати мої API


3
Насправді REST - це купа обмежень. Існує єдине обмеження інтерфейсу, яке стверджує, що ви повинні використовувати стандарти, щоб відокремити сервер від клієнта. Це можуть бути стандарт HTTP, стандарт URI, типи MIME, використовуючи гіпермедіа, вокаби RDF тощо ... Ви можете вибрати, який стандарт використовувати. Немає жорстких стандартів про те, як будувати URI, лише власні правила ...
inf3rno

21

Яка домовленість RESTful щодо того DELETE, що повинен містити орган відповіді?

REST - це архітектурний стиль, визначений Філдінгом у главі 5 його дисертації, і він описує набір контрантів для додатків, побудованих з цією архітектурою. REST розроблений як незалежний від протоколу, але в главі 6 тієї ж дисертації описано, як REST застосовується через HTTP.

Коли ваша програма REST розроблена поверх протоколу HTTP, ви повинні знати про семантику HTTP. А суть протоколу HTTP / 1.1 в даний час описана в RFC 7231 .


Корисне навантаження відповіді на DELETEзапит, який успішно виконано, може:

  • Бути порожнім або;
  • Включіть представлення статусу дії.

І наступні коди стану відповіді підходять для успішного DELETEзапиту:

  • 202: Запит прийнято до обробки, але обробка не завершена.
  • 204: Сервер успішно виконав запит і відсутність додаткового вмісту для надсилання у тілі корисного набору відповіді.
  • 200: Запит успішно виконано, і корисне навантаження запиту включає представлення статусу дії.

Дивіться наступну цитату з RFC 7231 :

Якщо DELETEметод успішно застосовано, початковий сервер ПОВИНЕН надіслати 202(прийнятий) код стану, якщо дія, швидше за все, буде успішною, але ще не здійснена, 204код стану (без вмісту), якщо дія була здійснена, і подальшої інформації не надсилається. або 200код стану (OK), якщо дія була виконана, а повідомлення відповіді включає подання, що описує стан.


Більш конкретним посиланням на RFC буде tools.ietf.org/html/rfc7231#section-4.3.5 :)
Дмитро Попов,

18

204 No Contentє популярною відповіддю для DELETEта інодіPUT .

Однак, якщо ви впроваджуєте HATEOAS, повернення a 200 OKіз посиланнями для переходу може бути більш ідеальним. Це тому, що HATEOAS REST API забезпечує контекст для клієнта. Подумайте, куди переходить користувацька програма після успішного видання команди видалення. Ось короткий уривок статті з додатковим обговоренням цього питання. Дивіться статтю блогу для більш повного обговорення.

Уникайте 204 відповідей, якщо ви створюєте додаток HATEOAS.

Це урок про дизайн REST API, який я вивчив під час створення нетривіальних REST API. Щоб максимально підтримати клієнта, REST API не повинен повертати 204 відповідей (без вмісту).

З точки зору служби, відповідь 204 (без вмісту) може бути цілком дійсною відповіддю на запит POST, PUT або DELETE. Зокрема, для запиту DELETE це видається дуже доречним, адже що ще ви можете сказати?

Однак, з точки зору належного клієнта, який знає HATEOAS, відповідь 204 є проблематичною, оскільки немає посилань для переходу. Коли гіпермедіа діє як двигун стану програми, коли немає посилань, немає стану. Іншими словами, відповідь 204 відкидає весь стан програми.

Ця стаття охоплює POST, PUT, DELETEі GET. Ось конкретна дискусія щодо DELETE:

Відповідаючи на запити DELETE

Запит DELETE представляє намір видалити ресурс. Таким чином, якщо служба успішно обробляє запит DELETE, що ще вона може зробити, ніж повернення 204 (Без вмісту)? Адже ресурс щойно видалено.

Ресурс часто є членом колекції або іншим чином "належить" контейнеру. Як приклад, http://foo.ploeh.dk/api/tags/rock представляє тег "рок", але інший спосіб розглянути його полягає в тому, що ресурс / rock міститься в контейнері тегів (який сам є ресурс). Це повинно бути знайоме користувачам Atom Pub.

Уявіть, що ви хочете видалити ресурс http://foo.ploeh.dk/api/tags/rock . Для досягнення цієї мети ви подаєте проти неї запит DELETE. Якщо ваш клієнт повертає собі 204 (без вмісту), він просто втрачає контекст. Куди це звідти йде? Якщо ви не тримаєте інформацію про клієнта, ви не знаєте, звідки ви прийшли.

Замість того, щоб повернути 204 (Без вмісту), API повинен бути корисним та пропонувати місця для відвідування. У цьому прикладі, я думаю, одне очевидне посилання - http://foo.ploeh.dk/api/tags - контейнер, з якого клієнт щойно видалив ресурс. Можливо, клієнт хоче видалити більше ресурсів, тож це буде корисним посиланням.


Питання щодо DELETEHATEOAS насправді залежить від того, як хтось бажає застосовувати HATEOAS. Якщо реалізація HATEOAS включає сервер, що повертає відносини посилань, вбудовані в тіло повідомлення (тобто HAL або json-ld ), то це 204 No contentможе бути не найбільш кошерним кодом стану. Однак, якщо реалізація HATEOAS має в заголовках відповідей відносини посилання на зворотне посилання сервера (тобто веб-посилання ), 204 No contentце абсолютно кошерно.
RAM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.