Как Socket.io и Restful работать вместе?
-
27-10-2019 - |
Вопрос
(Я не знаком с спокойным, пожалуйста, поправьте меня, если моя концепция неверна)
В спокойной архитектуре мы сопоставляем все действия на URL. Если я нажму «опубликовать статью», пусть это на самом деле URL http://example.com/
и некоторые данные action=post&content=blahblah
.
Если я хочу опубликовать, но не обновить всю веб -страницу, я могу использовать xmlhttprequest JavaScript. Я публикую его, а затем получаю его контент и вставляю его в Div на моей странице. Это действие все асинхронно.
Тогда я знаю, что есть что -то названное WebSocket
И это обертка socket.io
. Анкет Он использует «сообщение» для связи между клиентом и сервером. Когда я нажимаю «публиковать» клиент, просто позвоните socket.send(data)
и подождать сервера client.send(data)
. Анкет Это волшебно. Но как насчет URL?
Можно использовать две модели, но не повторяя себя? Другим словом, каждое действие имеет свой URL, и некоторые из них могут взаимодействовать с пользователем в реальном времени (by socket.io?)
Более того, мне это сделать? В очень интерактивной веб -программе (Ex. Games) Restful по -прежнему значимы?
Решение
Вы определяете обработчик для действий, которые отображаются на HTTP. Поместите и получите, как правило, обратитесь к обновлению и запросу над сущностью. Нет абсолютно никаких причин, по которой вы не можете просто определить обработчик для общих версий этих операций CRUD, которые можно использовать в обоих контекстах. То, как я обычно делаю это, заключается в представлении концепции «маршрута» на транспорт в реальном времени и отображая их обратно с теми же обработчиками CRUD.
У вас есть сеанс, вы можете навязывать тот же ACL и т. Д.
+---------------------------------+
| |
| BROWSER |
| |
+--+--^-------------------+---^---+
| | | |
| | | |
+--v--+---+ +--v---+---+
| | | |
| HTTP | | SOCKET.IO|
+--+---^--+ +--+---^---+
| | | |
+--v---+------------------v---+---+
| |
| ROUTING/PUBSUB |
+-+--^-------+--^-------+--^------+
| | | | | |
+-v--+--+ +-v--+--+ +-v--+-+
| | | | | |
| USERS | | ITEMS | |ETC |
+-------+ +-------+ +------+
ENTITY CRUD HANDLERS
Другие советы
я опубликовал это в моем блоге совсем недавно:
Проектирование API CRUD для веб -билетов
При здании Сварка, мы используем и REST, и WebSockets (Socket.io). Три наблюдения на веб -окетах:
- Поскольку WebSockets настолько свободны, вы можете назвать события, как вы хотите, но в конечном итоге невозможно отладить.
- В веб -окетах нет формы запроса/ответа HTTP, поэтому иногда может быть трудно сказать, откуда происходит событие или отправится.
- Было бы неплохо, если бы веб -тока могли вписаться в существующую структуру MVC в приложении, предпочтительно, используя те же контроллеры, что и API REST.
Мое решение:
- У меня есть два файла маршрутизации на моем сервере: Routes-rest.js а также маршруты-нокеты.js
- Мои события выглядят как этот пример:
"AppServer/user/create"
. - я использую Правовые удары («/»), Чтобы события выглядели как пути маршрутизации.
- Первая строка - это цель (~ «Имя хоста», если это на самом деле было путем).
- Вторая строка - это модель.
- Третья строка - это Глагол Crud: т.е. Создать, читать, обновить, удалить.