3

我现在熟悉 Action Cable(Rails 5 功能)作为 websocket 的发射器或服务器。但是,我应该使用一个通过 websockets 发送数据的 API(例如'socket.provider.com?token=12345')。

我使用 socket.io-client-simple ( https://github.com/shokai/ruby-socket.io-client-simple ) 对一个普通的 Ruby 文件进行了一些测试,它可以工作,但我不确定这是如何工作的将在已部署的 Rails 应用程序上工作。我猜我需要一个单独的进程来不断地监听 API 提供者发出的事件。有没有人做过类似的事情?我将使用 Heroku 进行部署。

注意:我认为使用客户端方法接收 websocket,然后将它们发布到我的 Rails 应用程序(即 Javascript Socket.IO 库)不是一种选择,因为我需要接收并保留来自事件的一些数据实时而不依赖于至少一个客户端的连接。

我还想知道是否有任何方法可以自动将 Action Cable 设置为以某种方式充当“事件侦听器”。到目前为止,还没有阅读任何关于该主题的内容,但希望看到有关该方向的一些建议。

更新:这是迄今为止我用来连接到提供商的 websockets API 的 Ruby 代码:

require 'rubygems'
require 'socket.io-client-simple'

socket = SocketIO::Client::Simple.connect 'https://api.provider.com', token: '12345'

socket.on :connect do
  puts "connect!!!"
end

socket.on :disconnect do
  puts "disconnected!!"
end

socket.on :providerevent do |data|
  puts data
end

socket.on :error do |err|
  p err
end

puts "please input and press Enter key"
loop do
  sleep 100
end
4

1 回答 1

3

ActionCable 不能自己监听外部站点的事件,因此您必须将 socket.io 和 ActionCable 结合起来。

ActionCable 可以像这样向频道发送更新:

ActionCable.server.broadcast "channel_name", param1: your_param1, param2: your_param2

在事件发生时更新频道。您频道的咖啡脚本文件的 received 操作是您必须对其进行操作的地方。据我了解,您正在监听事件的控制器中寻找类似的东西:

def listen
  socket.on :connect do
    # persist your data 
    # example: @post = Post.create(...)
    ActionCable.server.broadcast "channel_name", post_title: @post.title
  end
end

在你的 channel_name.coffee 中:

received: (data) ->
  console.log(data["post_title"])
  # do something

使用此设置,您将从 api 接收事件,并将其广播到您的频道。每次您的套接字接收到事件时,设置通道的页面都会更新。

您应该首先遵循 DDH 的教程,然后您可能会更好地理解我的解决方案(这很容易实现)。

于 2016-05-23T06:50:13.200 回答