如何使用 Rails 和 Server-Sent Events 构建实时 Web 应用程序

阅读时长 6 分钟读完

在现代 Web 应用程序中,实时性变得越来越重要。无论是社交网站、在线聊天还是股票市场监控,用户都希望立即看到数据更新。本文将介绍如何使用 Rails 和 Server-Sent Events 技术构建实时 Web 应用程序。

Server-Sent Events

在了解如何使用 Server-Sent Events 构建实时 Web 应用程序之前,我们需要了解什么是 Server-Sent Events。

Server-Sent Events(SSE)是一种传输和接收实时事件的技术。它使用 HTTP 协议建立长连接(长轮询)并发送更新到客户端。与 WebSocket 相比,它更简单、更易于使用,对于一些不需要频繁通信的实时应用程序,SSE 是一个不错的选择。

SSE 建立在 HTTP 协议之上,并使用 text/event-stream 格式发送更新事件。一个被称为事件流 event stream 的 HTTP response 需要设置正确的 MIME 类型 text/event-stream,并使用“data: ”前缀来指定事件数据。

例如,下面是一个发送时间数据的简单事件流:

每行都是一个事件。如果设置了 data 字段,SSE 客户端会收到一个更新事件。

在 Rails 中使用 Server-Sent Events

了解了 SSE 技术之后,我们将进入如何在 Rails 中使用 SSE 构建实时 Web 应用程序。

  1. 添加路由并设置 controller 和 action

在 Rails 中使用 SSE,需要设置路由并创建 SSE controller 和 action。

例如,我们为 SSE 创建一个名为 "updates" 的 controller 和 "stream" action ,在 routes.rb 中添加如下行:

在 controller 中定义 "stream" action:

-- -------------------- ---- -------
----- ----------------- - ---------------------
  ------- ----------------------

  --- ------
    -------------------------------- - -------------------
    --- - ------------------------ ------ ---- ------ ----------
    ---- --
      ----------- ----- -------- --
      ----- -
    ---
  ------ -------
    - ------------- --- ------- --
  ------
    ---------
  ---
---

上述代码中,我们在 response 的 header 中设置正确的 Content-Type,并创建 SSE 对象来写入事件。循环体内,我们写入一个包含当前时间的事件。使用 sleep 让循环与客户端异步,并且在发送事件时暂停了一秒,让我们可以看到更新(每秒钟一次)。

  1. 客户端使用 JavaScript 和 EventSource API

在客户端,我们使用 JavaScript 和 EventSource API 来建立与服务端的 SSE 连接并接收事件。

创建一个新的 EventSource 对象,为它提供 SSE 的 URL:

然后,我们可以通过 addEventListener 监听事件,并且在接收到时间时更新网页 GUI。

在这段代码中,我们监听来自服务器的 "updates" 事件,并使用 JSON 解析事件数据,更新网页上的时间标签。

示例代码

下面是一个简单的示例代码,演示如何在 Rails 中使用 Server-Sent Events 实现实时更新时间:

controller:

-- -------------------- ---- -------
----- ----------------- - ---------------------
  ------- ----------------------

  --- ------
    -------------------------------- - -------------------
    --- - ------------------------ ------ ---- ------ ----------
    ---- --
      ----------- ----- -------- --
      ----- -
    ---
  ------ -------
    - ------ ------------
  ------
    ---------
  ---
---

views:

-- -------------------- ---- -------
--- ---------------

--------
  --- ------ - --- -------------------------------

  ---------------------------------- ----------- -
    --- ---- - -------------------
    ----------------------------------------- - ------ - - ----------
  -- -------

  -------------------------------- ----------- -
    ------------------ -----------
    ---------------
  -- -------
---------

总结

在本文中,我们介绍了 Server-Sent Events 技术及其用于构建实时 Web 应用程序的能力。使用 Rails 和 EventSource API,我们可以很容易地实现 SSE Streaming 和接收 SSE 事件。如果你需要构建实时应用程序,使用 SSE 可能是比 WebSocket 更适合的选择。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651cebbd95b1f8cacd46f15a

纠错
反馈