RESTful интерфейс для вещей, которые имеют присущие «сессии» - PullRequest
4 голосов
/ 23 декабря 2010

Я только начинаю пытаться понять принципы проектирования REST и испытываю трудности с первым примером, который я пробую.

Допустим, я хочу разработать REST API для чего-то вроде SSH-сессии. Не обращая внимания на безопасность, вход в систему и т. Д., Я предполагал, что будет что-то вроде URI / сессий, и я инициирую сеанс SSH, отправив в / сессий указание информации о соединении, имени хоста, имени пользователя и тому подобное. Это приведет к тому, что веб-сервер, обслуживающий REST API, будет инициировать сеанс SSH от моего имени, назначит ему какой-то идентификатор и вернет URI / session / [id]. Затем я мог бы взаимодействовать с этим сеансом с подресурсами этого URI. Это не очень хорошая аналогия с тем, что я хочу сделать, но в ней есть важный момент: попытка определить интерфейс для чего-то, что имеет «сеанс», и чье состояние меняется, когда я отправляю вещи в ресурсы внутри него.

Теперь моя проблема в масштабируемости, но я не могу придумать ничего лучшего. Он полагается на веб-сервер, инициирующий соединение SSH с хостом, и это соединение должно поддерживаться веб-сервером (поэтому будет потеряно, если веб-сервер придется перезапускать). Он также связывает мой запрос с одним веб-сервером - у меня просто не могло быть фермы веб-серверов, обрабатывающих запросы API.

Я мог бы перенести создание и обслуживание SSH-соединений на другой сервер, но это только решило проблему масштабируемости. И в любом случае, тогда мне нужно определить API для этого сервера, и почему бы мне не сделать его REST API, и в этом случае я только что получил дубликат первого, до бесконечности.

Теперь я, возможно, просто смотрю на это неправильно, не будучи достаточно ориентированным на ресурсы, но, на мой взгляд, здесь "ресурс" - это соединение SSH. Моя проблема в том, что ресурс не является чем-то, что легко разделяется - это то, что веб-сервер создает и является по существу временным.

Есть ли какие-нибудь гуру разработки RESTful API, готовые помочь мне в лучшем пути? Обратите внимание, что я на самом деле не думаю, что это действительно специфично для REST - возникнет существенная проблема проектирования. Я представляю, какой подход я когда-либо использовал, чтобы разработать его как веб-сервис, исходя из того, что взаимодействие с веб-сервисом не требует сохранения состояния.

Спасибо.

[РЕДАКТИРОВАТЬ:] Моя другая проблема с этим подходом - «утечка» ресурсов «сеанса», когда клиенты явно не удаляют их. Самым разумным решением, которое я могу придумать для этого, является определение некоторого свойства сеанса (возможно, устанавливаемого при создании, может быть фиксированного), которое определяет время, к которому вам нужно снова связаться с сеансом, прежде чем он будет считаться устаревшим и удаленным. Клиент получит доступ к этому свойству (скажем, / session [id] / keepalive или что-то в этом роде), которое вернет метку времени, разделит ее на два (хорошо взять точку времени на полпути между сейчас и потом) и убедится, что, если ничего больше, не «опрашивает» сервер, снова получив доступ к тому же ресурсу до этого времени. Если это не удастся, то сеанс будет восстановлен. Это самый «подход RESTful», который я могу придумать, но он оценил бы более опытные умы RESTful.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

Обычно для того, чтобы иметь возможность объявить что-либо как ресурс, его нужно либо хранить в каком-то постоянном хранилище, либо легко воспроизводить. Как вы говорите, сеанс - это довольно временная вещь, которую можно попытаться смоделировать как ресурс. Это также то, что обычно привязано к одному клиенту. Однако ресурс обычно используется совместно, что является одной из причин, по которой ему назначается общедоступный URI. Все это говорит о том, что вы пытаетесь втиснуть круглый колышек в квадратное отверстие.

Сказав это, если вы действительно хотите это сделать и хотите масштабироваться, я могу придумать два возможных пути. Один из них - инициировать сеанс на одном сервере «БД». Это позволит вам масштабировать веб-серверы. В зависимости от того, где выполняется большая часть работы, это может иметь или не иметь какое-либо значение.

Другой вариант - воспользоваться преимуществами гипермедиа, чтобы позволить вам использовать веб-сервер в качестве инициатора сеанса, но вам необходимо убедиться, что имя хоста веб-сервера является частью URI ресурса сеанса. REST-клиенты не должны делать какие-либо предположения относительно URI и должны всегда читать их из предыдущих ответов. Если вы используете это в своих интересах, вы можете распределять сеансы между различными веб-серверами, и клиент просто переходит по URL, чтобы найти сеанс, независимо от того, на каком веб-сервере он находится.

1 голос
/ 23 декабря 2010

Я думаю, что здесь есть несколько проблем с REST, некоторые из которых связаны с тем, что вы в корне пытаетесь реализовать SSH через HTTP. Среди вопросов, которые я вижу:

(1) Управление состоянием клиента сервером - если вы не сохраняете текущее соединение (что кажется странным), вы нарушаете дух REST без сохранения состояния.

(2) Объединение действий в «обновления» в соединении , а не действий на реальных ресурсах. Из того, что вы описываете, видно, что действия, которые происходят в установленном соединении SSH, будут смоделированы как ОБНОВЛЕНИЯ для соединения SSH, если вы используете само соединение в качестве ресурса.

Конечно, никто не бросит вас в тюрьму из-за того, как вы ОТДЫХАЕТЕСЬ, но в целом я согласен, что вы пытаетесь вставить квадратный колышек в круглое отверстие.

Вместо этого я бы спросил себя, почему это нужно ОТДЫХАТЬ. Соединения SSH хорошо понятны и могут быть сделаны между сторонами различными способами, не выдумывая того, что вы описываете. На самом деле, если вы задумываетесь о написании веб-приложения на основе графического интерфейса для своей задачи, похоже, что вы пытаетесь реализовать одно из тех решений с зеленым экраном через HTTP, которые обычно не имеют счастливого конца, поэтому я лично избегайте этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...