web-dev-qa-db-ja.com

APIとしてActionCableを使用する方法

Rails 5ベータ1とActionCableを使用して非常にシンプルなアプリを作成し、ユーザーがオンラインになったことを表示して、お互いにメッセージを送信できるようにしました。

今、私は基本的にActionCableのクライアント側の部分を取り、それを別のアプリのコンテキストで実装します(それはnotを実行しますRails 5)および最初のアプリと接続して、データ(ユーザーのオンラインステータスやメッセージなど)を送受信します。

その2番目のアプリからデータを送信するには、AJAX POST requestを作成するだけでよいと思います。質問は次のとおりです。登録方法2番目のアプリから最初のアプリのオープン接続へ?

または:API経由で別のアプリからRailsアプリのActionCable接続にサブスクライブするにはどうすればよいですか?

私の推測では、基本的にこのコーヒースクリプトを2番目のアプリに何らかの形で含めたいと思います。

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) ->
    # ...
19
sam

Mwalsherの解決策は非常に役に立ちましたが、最近、Railsリポジトリに私の質問に対する公式の解決策が記載されたプルリクエストが見つかりました。

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

近い将来、これはメインのドキュメントに追加されると思います。これが公式のactioncable npmパッケージへのリンクです: 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 Guides。

21
sam

基本的には、ActionCable JSコードのコピーまたはポートを他のアプリに含める必要があります( https://github.com/Rails/rails/tree/master/actioncable/app/assets/javascripts =)。

更新:私は最近、Ruby on Rails 5's ActionCable CofeeScript to Rails外で使用するためのダイレクトポート)を提供するactioncable-jsと呼ばれるnpmパッケージをリリースしました: https://github.com/mwalsher/actioncable-js

ActionCableはHTML5 WebSocketsの上のレイヤーにすぎないため、生のWebSockets JSコード(またはサードパーティのライブラリ)を使用してメッセージングを処理することもできます。

ActionCableメッセージプロトコルについては、多少文書化されています: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol 。便宜上、以下に貼り付けます。

  1. アクションケーブルのURLに接続する
  2. 接続が成功したら、サブスクライブメッセージを送信します

    • サブスクライブメッセージJSONは次のようになります。{"command":"subscribe","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
    • 次のようなメッセージが表示されます:{"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
  3. 登録すると、メッセージを送信できます。

    • アクション文字列がActionCableサーバーのデータ処理メソッド名と一致することを確認してください。
    • メッセージJSONは次のようになります:{"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"message\":\"hello from user2\",\"action\":\"chat\"}"}
    • 受信したメッセージはほぼ同じように見えるはずです
  4. ノート:

    • サーバーに送信されるすべてのメッセージには、コマンドと識別子キーがあります。
    • チャネル値は、ActionCableサーバー上のチャネルクラスの名前と一致する必要があります。
    • identifierdataは冗長にjson化されています。

したがって、たとえば(Rubyの場合)

payload = {
  command: 'command text',
  identifier: { channel: 'MeshRelayChannel' }.to_json,
  data: { to: 'user', message: 'hi', action: 'chat' }.to_json
}.to_json
21
mwalsher