Rails API 应用程序中 ActionCable 的 Websocket 客户端

Posted

技术标签:

【中文标题】Rails API 应用程序中 ActionCable 的 Websocket 客户端【英文标题】:Websocket client for ActionCable in Rails API app 【发布时间】:2018-01-28 18:33:45 【问题描述】:

我需要在我的 Rails API(仅限)应用程序中使用 Websocket。页面没有任何服务器端呈现。该应用程序是 Angular 和 Xamarin 的纯 JSON 后端。我看到很多教程在 Rails 中使用 coffescript 作为 ActionCable 客户端,但我不是这样。

问题是:如何在 Rails 的咖啡脚本之外使用 ActionCable 作为 API-only,比如 androidios、Angular 和 React 客户端?

我找到了不同且有用的资源,但我还是有点困惑。

1: ActionCable usage for Rails API - 这似乎是最好的,但我怎样才能找到 ActionCable 框架交换的所有 JSON 命令?

2:Similar Question to the mine

3: Rails API Websocket GEM - 好吧,不是ActionCable,但是这家伙已经将coffescript编译成JS并移植到项目中。对移动开发没有用处。

如果有不同的解决方案或更好的知识,请告诉我。我需要“破解”它以使其正常工作。

编辑:我也找到了这个 repo action-cable-js,但是如何集成呢?

【问题讨论】:

是否可以选择不使用 ActionCable 的 Websockets?如果是这样,请考虑iodine gem。它还应该显着提高性能(与 ActionCable 相比)。 @Myst 您的回复。该策略并不“那么容易”,因为后端由 N 个 Rails 容器组成,由 nginx 负载均衡。因此,有一个(或者可能是 M 个负载平衡的)独立的 ActionCable 服务器,作为独立服务器运行。在这种情况下,我认为 iodine 或 ActionCable 是性能问题,但我需要重新设计整个应用程序。我会深入检查宝石。谢谢! 【参考方案1】:

仅 API 的 Actioncable 已获得官方支持,还有一个名为 actioncable 的 npm package,它对使用仅 API 的方法与 actioncable 服务器进行通信的支持解耦。

npm install actioncable

然后在你的反应/角度代码中

import ActionCable from 'actioncable';

# create a connection with the actioncable server
# use ws:// for http and wss:// for https
const cable = ActionCable.createConsumer("ws://your-backend-server.com/cable");
# now you create a subscription
my_subscription = cable.subscriptions.create("MessengerChannel", 
  connected: function() 
    console.log("You've subscribed to the Messenger Channel");
  ,
  disconnected: function() 
    console.log("You've disconnected from the Messenger Channel");
  ,
  received: function (received_data) 
    # broadcast data from the Messenger channel is received here
    console.log(received_data);
  
)

在后端,你需要挂载 actioncable,为此做这个

# routes.rb file
Rails.application.routes.draw do
  mount ActionCable.server => '/cable'
end

【讨论】:

【参考方案2】:

我希望我的回答对任何人都有用。我终于发现了一个名为 actioncable-js 的库,它在 Angular 项目中帮助了我。

但还不够。对于移动项目,我需要使用“低级”命令与 Action Cable 服务器交互。

协议在这里:protocol。

但如果您需要更多信息,您应该深入了解宝石。

【讨论】:

以上是关于Rails API 应用程序中 ActionCable 的 Websocket 客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ActionCable 在 Rails( api-only ) 应用程序中主动发送消息?

在应用程序文件夹中为 api 组织 Rails 文件

带有 Rails API 的 Django 应用程序

是否有任何 REST API 可以在 rails 中的 quickblox 中获取在线用户

无法在 Rails 4 中自动加载常量 API 控制器

在 Rails api 应用程序中存储会话