Чи є проблеми із впровадженням спеціальних методів HTTP?


34

У нас є URL-адреса в наступному форматі

/ instance / {instanceType} / {instanceId}

Ви можете викликати його за допомогою стандартних методів HTTP: POST, GET, DELETE, PUT. Однак ми вживаємо ще декілька дій, таких як "Зберегти як чернетка" або "Curate"

Ми думали, що ми можемо просто використовувати спеціальні методи HTTP, такі як: ПРОЕКТ, ВАЛІДАТ, КУРАТ

Я думаю, що це прийнятно, оскільки кажуть стандарти

"Набір загальних методів для HTTP / 1.1 визначено нижче. Хоча цей набір може бути розширений, додаткові методи не можна вважати спільними для тієї самої семантики для окремо розширених клієнтів та серверів."

І такі інструменти, як WebDav, створюють деякі власні розширення.

Чи є проблеми, у кого хтось зіткнувся зі спеціальними методами? Я думаю про проксі-сервери та брандмауери, але будь-які інші проблемні сфери вітаються. Чи варто залишатись у безпечній стороні і просто мати такий параметр URL-адреси, як action = валідація | curate | проект?


6
Як я цитую ще раз з RFC 1925 - "У дизайні протоколів досконалість була досягнута не тоді, коли не залишається нічого додати, а коли немає нічого, що можна забрати". - якщо це працює, немає ніяких причин додавати в http.

4
Нічого поганого, якщо ви зрозумієте, що зараз використовуєте користувацький протокол, а не HTTP.
user16764

10
@ user16764 "Набір загальних методів для HTTP / 1.1 визначено нижче. Хоча цей набір можна розширити, додаткові методи не можна вважати спільними для тієї самої семантики для окремо розширених клієнтів та серверів." w3.org/Protocols/rfc2616/rfc2616-sec9.html Тому це дозволено, і це все ще HTTP
Хуан Мендес

imho, нема чого додати / видалити з HTTP, оскільки в дефініціях методу зазначено, що використання спеціальних методів вже прийнятно в межах HTTP / 1.1, але не можна очікувати, що вони мають однакову семантику, тому я здогадуюсь, що точки з @MichaelT і Juan Mendes можуть бути дещо
приємним

Відповіді:


42

Одним з основних обмежень , HTTP і центральним елементом дизайну REST є рівномірна інтерфейс забезпечує (крім усього іншого) невеликий фіксований набір методів , які застосовуються універсально до всіх ресурсів. Рівномірне обмеження інтерфейсу має ряд плюсів і недоліків. Я цитую тут Філдінга вільно.

Уніфікований інтерфейс:

  • простіше.
  • розв'язує реалізацію від наданих ними послуг.
  • дозволяє багатошарову архітектуру, включаючи такі речі, як балансири завантаження HTTP (nginx) та кеші (лак).

З іншого боку, єдиний інтерфейс:

  • погіршує ефективність, оскільки інформація передається в стандартизованій формі, а не в тій, яка є специфічною для потреб програми.

Компроміси "розроблені для загальної справи в Інтернеті" і дозволили побудувати велику екосистему, яка забезпечує вирішення багатьох поширених проблем веб-архітектури. Дотримання єдиного інтерфейсу дозволить вашій системі скористатися цією екосистемою, порушуючи її, це ускладнить. Можливо, ви хочете використовувати балансир навантаження, наприклад nginx, але тепер ви можете використовувати лише балансир навантаження, який розуміє "ПРОЕКТ" та "СТРУКТУВАННЯ". Ви можете використовувати шар кешу HTTP, як Varnish, але тепер ви можете використовувати лише кеш-шар HTTP, який розуміє DRAFT і CURATE. Ви можете попросити когось про допомогу щодо усунення несправностей сервера, але ніхто більше не знає семантику CURATE-запиту. Можливо, буде важко змінити бажаний бібліотека клієнтів чи серверів, щоб зрозуміти та правильно реалізувати нові методи. І так далі.

Правильний спосіб * представити це як перетворення стану на ресурсі (або пов'язаних з ним ресурсах). Ви не розробляєте публікацію, перетворюєте її draftстан trueабо створюєте draftресурс, який містить зміни та посилання на попередні версії проекту. Ви не ТЕКУЮТЬ публікацію, ви перетворюєте її curatedстан на trueабо створюєте curationресурс, який пов'язує публікацію з користувачем, який її створив .

* Правильно в тому, що він найбільш дотримується архітектурних принципів REST.


Дякую за коментарі щодо збалансування навантаження, я обов'язково перегляну це. Чи знаєте ви про ресурс, який визначає, чи є власні методи прийнятними чи ні?
Хуан Мендес

2
Я не бачу жодних переваг у користувацьких методах, якщо вони не є частиною широко підтримуваного розширення, такого як WEBDAV (і навіть тоді не так багато), тому я ніколи не заглядав у нього. Я б просто рекомендував ставитися до цих змін як до перетворень держави. Інтернет працює просто чудово за допомогою методів, які ми вже маємо. Дійсно немає жодних вагомих причин додавати більше, якщо вони не мають сенсу як частина єдиного інтерфейсу (наприклад, PATCH).
Рейн Генріхс

5
Я бачу перевагу в розробці так, як ви хочете, щоб ваша служба HTTP працювала на себе. однак "не можна вважати, що" додаткові методи мають спільну семантику "- достатньо справедливо, але це все ще є частиною області HTTP / 1.1, тому брандмауери, проксі, балансири навантаження та інше повинні передбачати цю можливість, якщо вони не" t тоді вони не реалізують належним чином HTTP / 1.1?
Prof83

Ви, мабуть, вірно з неспокійного POV, однак, я не можу зрозуміти, чому власні дієслова повинні бути будь-якими проблемами. Усі інструменти повинні ставитися до них так само, як до POST, тобто "ресурс, ймовірно, змінюється, і це все, що ми знаємо".
maaartinus

7

Я вважаю за краще створити їх як підресурси, на які ви виконуєте запит POST.

Вважайте, що у вас є ресурс /instance/type/1, я б представив, що цей ресурс передає пару посилань на "дії", які можна виконати на ресурсі, наприклад, /instance/type/1/draftта /instance/type/1/curate. У JSON це може бути так просто, як:

{
    "some property":"the usual value",
    "state": "we can still inform the client about the current state",
    "draft": "http://server/instance/type/1/draft",
    "curate": "http://server/instance/type/1/curate"
}

Це дозволяє клієнту бути чітко викладеним щодо того, що має відбутися під час запиту POST на посилання, надане curateчленом. Ресурс, розміщений там, може містити аргументи, що деталізують подію, яка, можливо, спричинить перехід стану.

Підхід до «наївного» підходу переміщення між можливими станами на ресурсі має недолік не фіксувати, які події призвели до цих переходів.

Переходи станів, як правило, відбуваються у відповідь на конкретні події, і я б краще зафіксувати ці події, ніж дозволити клієнту вирішити, що щось зараз перебуває у конкретному «стані». Це також робить валідацію набагато важче. Плюс до того, ви не зможете зібрати жодних «аргументів», якщо ви також не опишете їх у самій державі. І тоді стає все химерним, коли якийсь код змінює ті, що не мають реального стану переходу, і потрібна перевірка, і все це швидко стає безладом.


Гарна відповідь. Надання можливості аргументувати переходи стану та мати сервер, який інкапсулює та керує ними, - це, безумовно, найкращий підхід.
Thomas W

Компанія, в якій я зараз перебуваю (VMware), робить це. GET, що /vms/some-idповертає посилання на такі дії, POST /vms/some-id/restartі ми використовуємо це для визначення, чи потрібно активувати чи відключати дії. У мене є стосунки з коханням / ненавистю з HATEOAS :)
Хуан Мендес

Було б набагато більше сенсу, якби дію було дієсловом запиту проти якогось випадкового параметра запиту, сегмента шляху ресурсу або властивості тіла.
Метью Віт

Ви не можете зв’язатись із дієсловом.
Дейв Ван ден Ейнде

6

Я думаю, що власний метод HTTP - це найкращий спосіб реалізувати дії сутності. Додавання дії до тіла сутності (POST) не здається правильним, воно не є частиною вашої сутності (хоча результат може бути збережений у ньому). Також, використовуючи власні методи HTTP, проксі-сервери можуть визначати їх дії без необхідності аналізу тіла об'єкта.

Це як CRUD, ви завжди хочете їх реалізувати, але також маєте свій власний набір дій (за суттю). Я дійсно не бачу, у чому б була проблема їх розширення.

Також @Rein Henrichs "Ви не створюєте посаду, перетворюєте її стан проекту в істинне або створюєте проект ресурсу", мені здається помилковим. draftsВластивість буде використовуватися для постійного збереження стану, а не для створення перетворення. Дії навіть не обов'язково призводять до "стану" або зберігаються у властивості. Створення окремої сутності для кожного стану / перетворення здається ще більш нечітким .. намагайтеся підтримувати ту саму посилання (URI) на сутність.


1
Це справедлива точка, хоча вона широко не погоджується, я можу бачити міркування, і я не згоден з протистоянням (особливо без коментарів виборця). Візьмемо для прикладу обробку винятків PHP, "Краща практика", схоже, схиляється до використання конкретних типів винятків, щоб запропонувати тип винятку, навіть ігноруючи фактичне повідомлення, наприклад RuntimeException проти BadMethodCallException. То чому ж так широко сперечається проти використання DRAFT, якщо використання спеціальних методів вже вважається частиною області HTTP / 1.1? І балансири навантажень і проксі-сервери дійсно повинні також сприймати цю можливість
Prof83
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.