Подтвердить что ты не робот

Как Socket.io и RESTFul работают вместе?

(Я не знаком с RESTFul, пожалуйста, поправьте меня, если моя концепция неверна)

В архитектуре RESTFul мы сопоставляем каждое действие с URL-адресом. Если я нажму "опубликовать статью", это может быть на самом деле URL http://example.com/ и некоторые данные action=post&content=blahblah.

Если я хочу опубликовать, но не обновить всю веб-страницу, я могу использовать javascript XMLHTTPRequest. Я отправляю его, а затем получаю его содержимое и вставляю его в div на моей странице. Эти действия являются асинхронными.

Тогда я знаю, что есть что-то с именем WebSocket и оно обертка socket.io. Он использует "сообщение" для связи между клиентом и сервером. Когда я нажимаю "post", клиент просто вызывает socket.send(data) и ждет сервер client.send(data). Это волшебство. Но как насчет URL?

Можно ли использовать две модели без повторения? Другими словами, каждое действие имеет URL-адрес, и некоторые из них могут взаимодействовать с пользователем в режиме реального времени (через socket.io?)

Кроме того, должен ли я это сделать? В очень интерактивной веб-программе (например, в играх) RESTFul по-прежнему имеет смысл?

4b9b3361

Ответ 1

Вы определяете обработчик для действий, которые отображаются в REST поверх http. POST и GET обычно ссылаются на обновление и запрос по сущности. Нет абсолютно никакой причины, по которой вы не можете просто определить обработчик для общих версий этих операций CRUD, которые могут использоваться в обоих контекстах. Как я обычно это делаю, это ввести понятие "маршрут" в транспорт в реальном времени и сопоставить их с теми же обработчиками CRUD.

У вас есть сеанс, вы можете наложить тот же ACL и т.д.

 +---------------------------------+
 |                                 |
 |      BROWSER                    |
 |                                 |
 +--+--^-------------------+---^---+
    |  |                   |   |
    |  |                   |   |
 +--v--+---+            +--v---+---+
 |         |            |          |
 | HTTP    |            | SOCKET.IO|
 +--+---^--+            +--+---^---+
    |   |                  |   |
 +--v---+------------------v---+---+
 |                                 |
 |        ROUTING/PUBSUB           |
 +-+--^-------+--^-------+--^------+
   |  |       |  |       |  |
 +-v--+--+  +-v--+--+  +-v--+-+
 |       |  |       |  |      |
 | USERS |  | ITEMS |  |ETC   |
 +-------+  +-------+  +------+
     ENTITY CRUD HANDLERS

Ответ 2

I недавно опубликовал это в своем блоге:

Проектирование CRUD API для WebSockets

При построении Weld мы используем как REST, так и WebSockets (Socket.io). Три наблюдения в WebSockets:

  • Так как WebSockets являются такой свободной формой, вы можете назвать события так, как вы хотите, но в конечном итоге отладка будет невозможна.
  • У WebSockets нет формы запроса/ответа HTTP, поэтому иногда бывает сложно определить, откуда происходит событие или собирается.
  • Было бы неплохо, если бы WebSockets могли вписываться в существующую структуру MVC в приложении, предпочтительно используя те же контроллеры, что и REST API.

Мое решение:

  • У меня есть два файла маршрутизации на моем сервере: routes-rest.js и routes-sockets.js
  • Мои события выглядят следующим образом: "AppServer/user/create".
  • Я использую косые черты ( "/" ), чтобы события выглядели как пути маршрутизации.
  • Первой строкой является target (~ "имя хоста", если это действительно был путь).
  • Вторая строка - это модель.
  • Третья строка - это CRUD-глагол: т.е. создавать, читать, обновлять, удалять.