2017-06-20 45 views
0

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

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

其他人怎么样?有没有我能找到的文件?

在此先感谢

+0

我会考虑目标客户端。我不知道ActionCable是否有非浏览器客户端,并且您可能希望Websocket API也可以访问本机移动应用程序(不仅仅是浏览器)....?附:我有偏见,因为我是碘(Ruby web套接字服务器)和[Plezi](http://www.plezi.io)(基于碘构建的实时应用程序框架)的作者。我投我自己的行动,让ActionSable的手中没有websockets。 – Myst

+0

是的,我的主要目标是处理手机,我想知道ActionCable是否适合实现这一点。 – mike927

回答

0

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

例如:

  • 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)。