gpt4 book ai didi

ruby-on-rails - 如何使用 ActionCable 作为 API

转载 作者:行者123 更新时间:2023-12-02 23:49:31 27 4
gpt4 key购买 nike

我使用 Rails 5 beta 1 和 ActionCable 构建了一个非常简单的应用程序,用于显示用户何时上线并让他们互相发送消息。

现在,我基本上想采用 ActionCable 的客户端部分,在另一个应用程序的上下文中实现它(它在 Rails 5 上运行)并将其与第一个应用程序连接发送和接收数据(例如用户的在线状态或消息)。

我认为,要从第二个应用程序发送数据,我可以简单地发出 AJAX POST 请求。问题是:如何从第二个应用程序订阅第一个应用程序的开放连接?

甚至:如何通过 API 从另一个应用程序订阅我的 Rails 应用程序的 ActionCable 连接?

我的猜测是,我本质上想以某种方式将这个 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) ->
# ...

最佳答案

您实际上需要在其他应用中包含 ActionCable JS 代码的副本或端口 ( https://github.com/rails/rails/tree/master/actioncable/app/assets/javascripts )。

更新:我最近发布了一个名为 actioncable-js 的 npm 包,它提供了 Ruby on Rails 5 的 ActionCable CofeeScript 到标准 JS 的直接端口,以便在 Rails 之外使用:https://github.com/mwalsher/actioncable-js

因为 ActionCable 只是 HTML5 WebSockets 之上的一层,所以您还可以使用原始 WebSockets JS 代码(或任何第三方库)来处理消息传递。

ActionCable 消息协议(protocol)在此处有所记录:https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol 。为了方便起见,我将粘贴在下面:

  1. 连接到操作电缆 URL
  2. 连接成功后,发送订阅消息

    • 订阅消息 JSON 应如下所示:
      {"command":"订阅","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
    • 您应该会收到如下消息:{"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
  3. 订阅后,您就可以发送消息。

    • 确保操作字符串与 ActionCable 服务器上的数据处理方法名称匹配。
    • 您的消息 JSON 应如下所示:{"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"消息\":\"来自用户2的问候\",\"操作\":\"聊天\"}"}
    • 收到的消息应该看起来大致相同
  4. 注释:

    • 发送到服务器的每条消息都有一个命令和标识符 key 。
    • channel 值必须与 ActionCable 服务器上 channel 类的名称匹配。
    • identifierdata 被冗余地 json 化。

例如(在 ruby 中)

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

关于ruby-on-rails - 如何使用 ActionCable 作为 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com