Чи порушують сеанси на стороні сервера REST?


14

За словами Роя Філдінга (одного з основних авторів специфікації HTTP), у своїй тематичній дисертації « Архітектурні стилі» при обговоренні REST він згадує:

[E] ах запит від клієнта до сервера повинен містити всю інформацію, необхідну для розуміння запиту, і не може скористатися будь-яким збереженим контекстом на сервері.

Під "збереженим контекстом" він має на увазі стан програми, наприклад, який номер сторінки для наступної сторінки відповідає стану ресурсу, наприклад, будь-який сховище даних, зображення тощо - що, мабуть, вся суть REST.

Чи справедливо сказати, що більшість спроб чистого спокою (цим визначається як реалізація, яка відповідає вищевказаній тезі) повинні бути невдалими через їх залежність від зберігання даних сеансу на сервері (постійних чи інших)?

Поняття сеансу є загальним - зокрема, для веб-розробників - але чи це RESTful відповідно до наведеного вище визначення?


2
Я б сказав, що згідно з цим визначенням практично нічого не є спокійним, але як це визначення навіть досить розумне? Уявіть собі "спокійний" пошук у Google, де вам потрібно вказати індекс Інтернету в запиті на Google, щоб він шукав вас. Що? Ні, сказати, що ви не можете мати магазин для постійної роботи та бути спокійним, було б рівнозначним, що говорити про спокійні інтерфейси насправді безглуздо. Це не означає, що ми повинні почати підтримувати сеанси пам’яті і говорити, що це все-таки хороший дизайн відпочинку ...
Jimmy Hoffa

3
Я думаю, слід зазначити, що існує різниця між станом програми та станом ресурсу (індекс Google був би ресурсом, і цілком законно). Я повинен зробити це більш зрозумілим у питанні.
Метт

є така відмінність? Будь ласка, визначте це. :) Я бачив, як люди намагаються визначити це раніше, але це стає справді нечітким, оскільки вони насправді не відрізняються. Вони є обома змінними даними, єдине релевантне розмежування однієї форми стану від іншої полягає в тому, чи є вона стійкою чи ні, де форма не означає, що вона, як правило, може бути відновлюваною, і це робить її різною.
Джиммі Хоффа

1
Я сам це задумався. Оскільки ніхто ніколи не пояснював, чому в моїй заяві потрібно хотіти золотої «спокійної» зірки, я не дуже хвилююся цим.
psr

Відповіді:


10

Я б сказав, що так, стан сеансу робить додаток RESTful не-RESTful. Тривіальний приклад, моя сестра підписується на журнал Wall Street Journal. Вона регулярно читатиме щось за платною стіною і вирішить надіслати посилання (через власний клієнт електронної пошти, а не через WSJ) другові, який не має облікового запису WSJ. Клацніть, надішліть, не вдасться. Очевидно, що досвід моєї сестри за цією URL-адресою відрізняється від досвіду її друга.

Пов’язана, але не строго тематична тема: я перебуваю на початковій стадії розробки програми, розробленої для підтримки значних зусиль у мережі (називаються квести (подумайте: закладки на стероїди та LSD)). Власник квесту хоче поділитися певним видом своїх даних з кимось іншим, але цей погляд вимагає комбінації стану користувальницького інтерфейсу (наприклад, які візуалізації даних, які відображаються на яких панелях), а також відповідні дозволи на доступ до інтерфейсу користувача і відображаються дані. Отримувачу потрібна велика кількість збереженого стану, щоб отримати призначений вид.

Моє поточне рішення - зберігати весь інтерфейс користувача / ACL / будь-яку інформацію, необхідну для перегляду, в окремому об'єкті та повертати URL-адресу (можливо, UUID) для цього об’єкта. Я вважаю, що доступ до об’єкта перегляду можна вважати ВІДКРИТИм у тому сенсі, що кожен, хто ним володіє, отримує однакову інформацію / досвід.


1
Ви переглядаєте приклад об'єкта - це ще один кут на це. Акуратний.
Метт

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

1
Якщо ви говорите, що сайт wsj є прикладом неспокійного додатка, я б не погоджувався, що ваш приклад це показує. Якщо веб-сайт WSJ, наприклад, покладається на дані, надані повністю клієнтом вашої сестри, щоб представити їй дані, то це за визначенням @Matt дало, RESTful. Якщо вона, однак, покладається на стан тимчасового сеансу в пам'яті, це, за визначенням, Метт не дав RESTful. Я просто зазначаю це, тому що визначення, яке дав Метт, засноване на специфіці впровадження, тоді як REST краще визначається технікою споживання.
Джиммі Хоффа

@JimmyHoffa - Я розумію обмеження REST в тому, що він без громадянства . Це здається мені досить однозначним.
Пітер Роуелл

Якби у програмі WSJ не було штату, переглянуту статтю повинен був надіслати клієнт. Цю статтю можна було в будь-який час відредагувати адміністраторами сайтів, не помиляйтесь, що вона є частиною стану програми WSJ. Я думаю, що до цього слід відзначити те, що він є стійким станом, тому він матиме більше гарантій і менше накладних витрат, ніж нестабільний стан, такий як сеанси, а також простіший контроль атомності в транзакціях по ньому. Це разом із простою моделлю споживання - це те, що люди хочуть відпочити. (Я думаю)
Джиммі Хоффа

2

Чи порушують сеанси на стороні сервера REST?

Вони точно роблять! Під час реалізації REST не повинно бути сеансів на стороні сервера, інакше у вас є гібридне рішення RPC / REST.

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


1

Напевно, залежить від того, що ви маєте на увазі під "сеансовими даними". Це точний термін?

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

Я був би дуже здивований, якби цей вид операцій був позначений як НЕБЕЗПЕЧНИЙ. OAuth - приклад.

Я не фахівець і тут не дуже впевнений; Я просто ділюся своїми думками, сподіваючись, що вони виявляться корисними.


1

Найважливішим моментом REST є те, що URI до ресурсу завжди вказує на той самий ресурс. Таким чином, користувачі можуть пройти посилання на цей ресурс, і всі бачать те саме. Це називається Представницький державний трансфер (REST). Якщо сервер зберігає стан і доставляє інший ресурс для того ж URI, я б сказав, що це вже не є чистим REST.


це не обов'язково вірно, що користувачі побачать те саме. Доступ може визначати, скільки бачить один користувач.
Ерік

@Erik Але користувач зазначить, скільки вони хочуть бачити у запиті (включаючи використання заголовка Accept), тому відповіді Puckl справджуються.
Йоган

1
@Johan Я б повертав різні дані для різних користувачів з тієї ж кінцевої точки. Інакше сенс аутентифікації користувача.
Ерік

@Erik Я теж би це зробив. Тим не менше, я вважаю, що автентифікація знаходиться поза станом ресурсу, тому строго кажучи, якщо на погляд впливає автентифікований користувач, то це вже не RESTful. Можливо, якщо ви хотіли свого значка RESTful, ви повинні створити кілька "поглядів" ресурсу, залежно від того, хто просить отримати доступ до нього, авторизує доступ лише до деяких переглядів. Таким чином, громадськість може отримати доступ до / userprofiles / {userID} / publicview, і користувач отримує доступ до / userprofiles / {userID} / fullprofile та уповноважені друзі отримують доступ до / userprofiles / {userID} / friendsview
Йоган

0

Сесії в основному використовуються для додавання стану в додатки без громадянства, RESTful. Таким чином, формально це робить вашу програму RESTful справжньою, однак наявність стану сервера полегшує ваше життя, оскільки вам не потрібно передавати всі дані туди-сюди при кожному запиті / відповіді.

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

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


Я не погоджуюсь. У вас є торговий сайт, який дозволяє фільтрувати за маркою, кольором та розміром. Традиційні веб-сайти Web 1.0 обробляють це за допомогою деяких прапорців, сеансу на стороні сервера та POST. Якщо я хочу поділитися посиланням на example.org/shirts, люди не побачать, що я вибрав Середній, Чорний та Коріння. (Це також спричиняє некрасиве повідомлення "ви перейменовуєте дані" при натисканні назад.) Але якщо я поділююсь посиланням на (наприклад) example.org/shirts/medium-black-roots, усі мають однакове представлення. Вся необхідна інформація про стан міститься в URL-адресі (або тілі POST, якщо необхідно, але ви не можете цим поділитися).
Джессі Бюкенан

... RESTful може не підходити до всього. Чи орієнтований ваш гіпотетичний ресурс програми (торговий сайт, безумовно, є!)? Можливо, це не може бути придатним для RIA, з великою кількістю штату, який не орієнтований на ресурси. Я не можу придумати жодних добрих прикладів, якщо чесно.
Джессі Бюкенан

0

Філдінг мається на увазі під тим твердженням, що сервер додатків, що розміщує API REST, не пов'язує оточуючий стан із запитом якогось механізму поза кадром. Розглянемо різницю між сервером програми та сервером баз даних . Обмеження REST полягає в тому, що сервер додатків повинен бути без стану . Однак сервер додатків може делегувати запити на стан ресурсу на сервер бази даних на основі інформації, яка є частиною запиту, наприклад комбінації користувача / пароля в заголовку авторизації або самого Uri. Зрештою, REST заснований на моделі клієнт / сервер.

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