【问题标题】:Rails ActionCable API modeRails ActionCable API 模式
【发布时间】:2023-03-22 19:30:01
【问题描述】:

我将创建基于 ActionCable 处理 WebSocket 的 Rails API(首先,在 API 模式下使用 ActionCable 是个好主意?)。 ActionCable 适用于全栈 Rails 应用程序,但我在使用 API 时遇到了困难。第一个问题是什么样的格式应该有所有对 actionCable 服务器的请求。到目前为止,我发现的只是订阅操作:

{
  "command":"subscribe",
  "identifier":"{\"channel\":\"SomeChannel\"}"
}

其他人呢?有没有我可以找到的文档?

提前致谢

【问题讨论】:

  • 我也会考虑目标客户。我不知道 ActionCable 是否有非浏览器客户端,并且您可能希望 Websocket API 也可以被本地移动应用程序(不仅仅是浏览器)访问......?附言我有偏见,因为我是 iodine(Ruby Web 套接字服务器)和Plezi(基于碘的实时应用程序框架)的作者。我用我的行动投票决定让 websocket 脱离 ActionCable 的控制。
  • 是的,我的主要目标是只处理手机,我想知道 ActionCable 是否适合实现这一目标。

标签: ruby-on-rails ruby websocket


【解决方案1】:

对于包含非浏览器客户端的 API 项目,我可能会避免使用 ActionCable 语义和内部协议。

例如:

  • ActionCable 的内部语义/协议可能会因版本而异。由于您的代码将与 ActionCable 的内部工作紧密耦合,因此升级可能会更加困难。

  • ActionCable 的内部语义/协议可能包含也可能不包含您需要的所有内容,而编写您自己的 Websocket 消息传递协议(尤其是使用 JSON)非常容易,并且会为您提供完全适合的服务。

这并不意味着您需要完全摆脱 Rails。在非 Rails Websocket 替代方案中使用 Rails 模型和代码应该很容易。

此外,Ruby 为 ActionCable 提供了一些不错的 Websocket 替代方案。

作为Iodine - an HTTP/Websocket server with native Pub/SubPlezi.io, a real-time web application framework 的作者,我有偏见……但我可能会使用碘(无论是否有Plezi 提供的额外舒适)。

一个简单的带有 Plezi 的 Websocket 应用程序看起来像这样(说真的,从终端使用 irb 运行以下代码,它可以工作):

require 'plezi'
class ChatServer
  def index
    "Use Websockets to connect."
  end
  def on_open
    @name = params['id'] || "anonymmous"
    subscribe channel: "chat"
    publish channel: "chat", message: "#{@name} joind the chat."
    write "Welcome, #{@name}!"
  end
  def on_close
    publish channel: "chat", message: "#{@name} left the chat."
  end
  def on_message data
    publish channel: "chat", message: "#{@name}: #{data}"
  end
  def on_shutdown
    write "Server shutting down. Goodbye #{@name}"
  end
end
Plezi.route '/', ChatServer

# We'll monitor message just for kicks:
subscription = Iodine.subscribe(pattern: "*") do |channel, message|
  # print a log?
  puts "\n* Message on channel #{channel}:\n#{message}\n"
end
# make sure we don't duplicate our monitoring on every process.
root_pid = Process.pid
Iodine.run { Iodine.unsubscribe(subscription) unless Process.pid == root_pid }

exit

不需要 Redis 服务器,无需准备任何特殊的东西,并且可以在 Rails 应用程序中使用 plezi 作为中间件(运行 iodine 服务器而不是 puma)。

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 2018-02-19
    • 1970-01-01
    • 2018-06-13
    • 2016-07-08
    • 2017-01-29
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多