Как использовать ActionCable в качестве API

Я создал очень простое приложение, используя Rails 5 beta 1 и ActionCable, чтобы показывать, когда пользователи подключаются к сети, и позволять им отправлять сообщения друг другу.

Теперь я хотел бы взять клиентскую часть ActionCable, реализовать ее в контексте другого приложения (которое не работает на Rails 5) и соединить ее с первым приложением для отправки и получать данные (например, онлайн-статус пользователей или сообщения).

Я предполагаю, что для отправки данных из этого второго приложения я могу просто сделать запрос AJAX POST. Возникает вопрос: Как мне подписаться из моего второго приложения на открытое соединение первого приложения?

Или даже: как мне подписаться на подключение ActionCable моего приложения Rails из другого приложения через API?

Я предполагаю, что я хочу каким-то образом включить этот coffeescript в свое второе приложение:

App.appearance = App.cable.subscriptions.create "AppearanceChannel",
  connected: ->
    # Called when the subscription is ready for use on the server

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
    # ...

person sam    schedule 10.02.2016    source источник


Ответы (2)


Хотя решение mwalsher было чрезвычайно полезным для меня, недавно я нашел запрос на включение в репозиторий Rails с официальным решением моего вопроса.

https://github.com/rails/rails/pull/24991

Полагаю, в ближайшее время это будет добавлено в основную документацию. Вот ссылка на официальный пакет npm actioncable: https://www.npmjs.com/package/actioncable< /а>

Вы можете использовать его аналогично решению mwalsher с любым JS-приложением. Просто установите пакет npm:

npm install actioncable --save

Вот пример JS из документации:

ActionCable = require('actioncable')

var cable = ActionCable.createConsumer('wss://RAILS-API-PATH.com/cable')

cable.subscriptions.create('AppearanceChannel', {
  // normal channel code goes here...
});

Редактировать: запрос на вытягивание уже некоторое время объединен, и описание является частью официального Readme — просто еще не в руководствах по Rails.

person sam    schedule 28.06.2016
comment
@jim broski, пожалуйста, поделитесь открытым репозиторием двух приложений, которые будут полезны разработчикам, плохо знакомым с rails и actioncable. По крайней мере, поделитесь постом об этом. Это будет полезно. - person Modi Ranga Nayakulu; 04.10.2016

По сути, вам потребуется включить копию или порт кода ActionCable JS в другое приложение (https://github.com/rails/rails/tree/master/actioncable/app/assets/javascripts).

Обновление: недавно я выпустил пакет npm под названием actioncable-js, который предоставляет прямой порт Ruby on Rails 5 ActionCable CofeeScript на стандартный JS для использования вне Rails: https://github.com/mwalsher/actioncable-js

Поскольку ActionCable — это просто слой поверх HTML5 WebSockets, вы также можете использовать необработанный JS-код WebSockets (или любую стороннюю библиотеку) для обработки обмена сообщениями.

Протокол сообщений ActionCable несколько задокументирован здесь: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol. Я вставлю ниже для удобства:

  1. Подключиться к URL-адресу кабеля действия
  2. После успешного подключения отправьте сообщение о подписке

    • The subscribe message JSON should look like this: {"command":"subscribe","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
    • Вы должны получить такое сообщение: {"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
  3. После подписки вы можете отправлять сообщения.

    • Make sure that the action string matches the data-handling method name on your ActionCable server.
    • Ваше сообщение JSON должно выглядеть так: {"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"message\":\"hello from user2\",\"action\":\"chat\"}"}
    • Полученные сообщения должны выглядеть примерно одинаково
  4. Примечания:

    • Every message sent to the server has a command and identifier key.
    • Значение канала должно соответствовать имени класса канала на сервере ActionCable.
    • identifier и data избыточно jsonified.

Так, например (в рубине)

payload = {
  command: 'command text',
  identifier: { channel: 'MeshRelayChannel' }.to_json,
  data: { to: 'user', message: 'hi', action: 'chat' }.to_json
}.to_json
person mwalsher    schedule 20.03.2016
comment
Да. Я тоже изучал это. Я чувствую, что это не так прямолинейно, хотя. По крайней мере не для меня. Есть некоторые части, которые необходимо отрегулировать, и их нельзя просто скопировать. К сожалению, порт ES6 не работает с самой последней версией Rails 5. - person sam; 22.03.2016
comment
Обновлен мой ответ со ссылкой на прямой порт ActionCable JS: github.com/mwalsher/actioncable-js . Надеюсь, это поможет! - person mwalsher; 27.04.2016
comment
Действительно, очень красивое решение. Спасибо, что собрали это вместе! Это очень полезно. Я решил опубликовать ответ самостоятельно, потому что только что нашел запрос на включение в репозиторий Rails с официальным пакетом NPM. - person sam; 28.06.2016
comment
Например, я хочу использовать для этого socket.io-client. Как подключиться к MeshRelayChannel с помощью socket.io-client? - person sreang rathanak; 20.12.2017