Які дзвінки REST PUT / POST / DELETE повинні відповідати умовно?


153
  1. Відповідно до "Ідеології REST", що має бути органом відповідей на запити PUT / POST / DELETE?

  2. Що з кодами повернення? Чи HTTP_OKдостатньо?

  3. У чому причина таких конвенцій, якщо такі є?

Я знайшов хороший пост з описом відмінностей POST / PUT: POST vs PUT, але він все ще не відповідає на моє запитання.

Відповіді:


130

Пробачте про невідповідність, але якщо ви робите REST через HTTP, то RFC7231 точно описує, яка поведінка очікується від GET, PUT, POST та DELETE.

Оновлення (3 липня '14):
Специфікація HTTP навмисно не визначає, що повертається з POST або DELETE. Специфікація визначає лише те, що потрібно визначити. Решта залишається за вибором виконавця.


9
@tuxslayer Я радий, що ти не думав, що я просто намагаюся бути химерним. Багато людей, здається, думають, що REST додає додаткові вимоги до методів HTTP. Однак це не так. Існують додаткові обмеження, але вони не дуже впливають на поведінку методів HTTP. RFC2616, безумовно, керівництво, яке слід дотримуватися.
Даррел Міллер

4
Я ціную посилання. :) Це змусило мене зупинитися і подумати про інструмент, який я використовую. Прочитавши ваш пост і RFC, я виявив, що решту ночі я посилаюся на RFC. Це допомогло мені подумати про цей процес як процес HTTP спочатку, а процес спокою - другий. Цінується.
Perry Tew

4
@PerryTew Тепер ви можете зайти сюди tools.ietf.org/wg/httpbis і побачити переглянуту в даний час версію специфікації HTTP. Насолоджуйтесь!
Даррел Міллер

12
Можливо, мені просто потрібно більше сну, але я, здається, не можу знайти точної інформації, яку вимагала ОП у RFC. Яким має бути орган для відповіді на повідомлення про POST або DELETE?
Cam Jackson

9
Ну, це так просто, як грязь. Можливо, ще трохи інформації у відповіді буде корисною. Тим більше, коли це посилання мертве.
Doug Molineux

25

Загалом, конвенції - "думайте, як тільки ви доставляєте веб-сторінки".

Для PUT я б повернув той самий погляд, який ви отримали, якби ви зробили GET відразу після; це призвело б до 200 (ну якщо припустити, що візуалізація є успішною). Для POST я б переспрямував на створений ресурс (якщо припустити, що ви робите операцію створення; якщо ні, просто поверніть результати); код для успішного створення - це 201, який насправді є єдиним кодом HTTP для переспрямування, що не входить у діапазон 300.

Я ніколи не був задоволений тим, що DELETE повинен повернути (мій код наразі створює HTTP 204 та порожній корпус у цьому випадку).


1
Маючи PUTповернення запиту на наступній сторінці , здається , як погана практика, так як освіжаючі на сторінці викликатиме запит знову виконати. Натомість, для мене, має сенс зробити переадресацію, припускаючи, що ви маєте справу з синхронними запитами.
lobati

1
@lobati Я думаю, що важливо відзначити, що надсилання декількох однакових запитів PUT має мати точно такий же результат, як і відправлення лише одного з тих же запитів PUT. Можливо, питання, яке ви ставите, зараз менш важливе, враховуючи вищезазначене?
Iain

3
@Iain не дуже. Проблема полягає в тому, що якщо щось інше оновить запис пізніше, ви не хочете, щоб він надсилав ще один PUTзапит, який спричиняє повернення даних. Наприклад, якщо двоє людей посилаються на одну і ту ж сторінку, одна робить оновлення, то інша робить оновлення, якщо перша особа оновиться, щоб побачити результат, це в кінцевому підсумку призведе до того, що речі будуть повернені до того, як друга особа зробила їх зміни.
lobati

"Думаю, що веб-сайт" є ідеальним, тому видалення може відповісти деякими ймовірними наступними діями, що залежить від "історії" навколо того, чому ви будете видаляти ресурс. Принаймні це може бути посилання, щоб повернути агента до якогось логічного початкового місця дій, або навіть переспрямування на ресурс стану, який показує вплив видалення (загальний порядок) та містить подальші посилання.
Люк Пуплетт

3

Створення ресурсу, як правило, відображається на POST, і це повинно повернути розташування нового ресурсу; наприклад, в ешафоті Rails CREATE буде переспрямовано на SHOW для новоствореного ресурсу. Цей же підхід може мати сенс для оновлення (PUT), але це менше конвенції; оновлення потрібно лише свідчити про успіх. Видалення, ймовірно, повинно вказувати і на успіх; якщо ви хотіли переадресувати, повернення СПИСОК ресурсів, мабуть, має найбільш сенс.

Успіх може бути вказаний HTTP_OK, так.

Єдине жорстке правило в тому, що я говорив вище, - це, що CREATE повинен повернути місце розташування нового ресурсу. Мені це здається нічим не мислителем; має ідеальний сенс, що клієнту потрібно буде мати доступ до нового товару.


2
Ви фактично змішали PUT і POST. POST використовується для створення, PUT використовується для оновлення (та створення). Варто також зазначити, що PUT повинен бути ідентичним, тоді як POST - ні.
Стіві

Команда idempotent повинна працювати належним чином, але багато разів, коли ви її запускаєте. Таким чином, ви повинні мати можливість робити один і той же PUT кілька разів, щоб застосувати те саме "оновлення" без жодних негативних побічних ефектів.
Джейкоб Маттісон

1

За RFC7231 це не має значення і може бути порожнім

Як ми реалізуємо стандартне рішення json api у проекті:

post / put: виводить атрибути об'єкта як у get (фільтр поля / відносини застосовується те саме)

delete: дані містять лише null (для представлення відсутнього об'єкта)

статус для стандартного видалення: 200


0

Мені подобається відповідь Альфонсо Тіенди з коду статусу HTTP для оновлення та видалення?

Ось кілька порад:

УДАЛИТИ

  • 200 (якщо потрібно надіслати деякі додаткові дані у відповіді) або 204 (рекомендується).

  • 202 Операція видалена ще не здійснена.

  • Якщо нічого не можна видалити, використовуйте 204 або 404 (операція DELETE є ідентичною, видалення вже видаленого елементу є успішною , тому ви можете повернути 204 , але це правда, що idempotent не обов'язково передбачає однакову відповідь)

Інші помилки:

  • 400 Поганий запит (неправильний синтаксис або поганий запит є дивним, але можливим).
  • 401 Несанкціонована помилка аутентифікації
  • 403 Заборонено : помилка авторизації або недійсний ідентифікатор програми.
  • 405 Не дозволено . Звичайно.
  • 409 Конфлікт ресурсів можливий у складних системах.
  • І 501 , 502 у разі помилок.

ПУТ

Якщо ви оновлюєте елемент колекції

  • 200/204 з тих же причин, що і ВИДАЛИТИ вище.
  • 202, якщо операція ще не здійснена.

Посиланий елемент не існує:

  • PUT може бути 201 (якщо ви створили елемент, тому що це ваша поведінка)

  • 404 Якщо ви не хочете створювати елементи через PUT.

  • 400 Неправильний запит (неправильний синтаксис або поганий запит, частіше, ніж у випадку DELETE).

  • 401 Несанкціонований

  • 403 Заборонено : помилка аутентифікації або недійсний ідентифікатор програми.

  • 405 Не дозволено . Звичайно.

  • 409 Конфлікт ресурсів може бути можливим у складних системах, як у DELETE.

  • 422 Unprocessable об'єкт Це допомагає відрізнити «Невірний запит» (наприклад , невірний формат XML / JSON) і неприпустимі значення поля

  • І 501 , 502 у разі помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.