该 WebSocket协议(WS)提供了在浏览器和服务器之间通过持久性连接交换数据的能力。数据通过它以 "数据包 "的形式双向传输,不会中断连接和额外的HTTP请求。
WebSocket适合于持续通信服务,如聊天室、网络游戏、实时市场等。
作为一个例子,让我们为一个简单的聊天创建一个后台。它有必要提供基本功能。
- 向聊天室发送消息。
- 确定消息的作者身份。
- 行动通知。例如,新成员加入聊天,离开聊天,打字指标(有人正在打字......)。
数据库模型
让我们先为数据库创建一个模型。即使我们最初不打算在数据库中存储消息和通信历史,我们仍然需要一个模型来构造发送消息和通知。
让我们创建一个通用的 chat_event模型,其中包含。
- 与用户的关系。任何消息都包括它所指的用户的信息。
- Type (enum)有4个可能选项的字段。 Connected和 Disconnected- 用于在用户连接或断开连接时的通知。 Typing- 用于传达用户正在写一条新信息的信息。 Message- 用于标准文本信息。
- Message (text)- 信息的文本。
端点配置
下一个开发步骤与应用程序的其他功能所通用的标准方法略有不同。通常,一个业务流程被创建,然后配置一个端点来运行它。在WebSockets的情况下,一切都发生得不同,起点是创建一个基于触发器的端点,进一步创建业务流程。
我们需要一个端点部分。There we create a new endpoint by selecting the appropriate option - WebSocket Endpoint.
对于WebSockets来说,请求方法是没有选择的--它总是 GET.让我们指定一个简单的URL - /chat/并为其创建一个同名的组。
接下来,我们需要创建变量,确定WebSocket中的数据交换格式。
- Client-to-Server.类似于标准业务流程的传入参数。在我们的例子中,我们将创建一个简单的文本变量信息(我们将向服务器发送普通文本信息)。
- Server-to-Client.这里的变量是为服务器消息创建的,从服务器向用户发送数据。请注意,这与对用户请求的响应不一样。而且,尽管它可以作为对用户行为的反应而发送,但它更多地是由一些外部事件引起的。在我们的例子中,服务器将发送聊天中所有事件的通知,所以我们将把 chat_event模型作为一个变量。
创建完变量后,您就可以进行主要工作了--创建WebSocket的逻辑。它基于触发器,当WebSocket上收到新消息以及建立或断开连接时,触发器就会启动。
创建一个业务流程
让我们使用 connect触发器并为其创建一个业务流程。它将在用户与WebSocket建立连接的时刻启动,其任务是向所有连接的用户发送有关通知。
请注意,启动块包括两个参数。 User ID和 Connection ID.因此,你不仅可以立即确定建立连接的用户,还可以获得这个连接的唯一标识符。在未来,这个标识符可以被用来,例如,发送有针对性的信息或强行终止连接。
创建业务流程的所有必要步骤。
- Make User.让我们使用起始参数 User ID来创建一个用户模型。
- Make chat_event.С创建一个事件通知模型。我们将使用上一步创建的模型将其连接到用户,同时选择事件类型并设置 Type = Connected.我们不使用消息参数,因为在这种情况下,传送的不是消息,而是一个连接通知。
- WSS Connections /chat/.使用此块,我们将获得所有活动的WebSocket连接的列表。
- For Each Loop.我们使用连接数组作为循环参数,向每个连接的用户发送通知。
- Expand WebSocket Connection.扩展连接信息以获得 Connection ID.
- WSS Send /chat/.我们使用 Connection ID和生成的 chat_event来发送通知。
使用Postman来测试WebSockets
在这个阶段,尽管WebSocket没有重要的功能,但它已经可以运行,并可以在实践中进行测试。要做到这一点,你可以使用任何允许你使用WebSockets的工具。让我们看一下如何以 Postman为例。
应该点击 New button并选择 WebSocket Request
你需要指定WebSocket的URL。可以使用Swagger找到它,WebSocket与其他端点一起在列表中。
与标准请求不同,WebSocket使用 wss协议,所以你需要将 https替换为 wss.结果应该是一个类似的URL:wss://qvlxglh-app.apms.io/api/chat/。
接下来,你需要在请求中添加一个认证令牌,因为连接不能是匿名的。你需要创建一个 Authorization头,其值为 Bearer lBCiunRWg6BfogDrLml4jrC4iJiWucKo.而不是lBCiunRWg6BfogDrLml4jrC4iJiWucKo,你需要插入你自己的令牌,它可以作为授权的结果获得(POST /auth/端点)。
如果一切操作正确,那么通过点击 Connect按钮,连接将被建立,第一条信息将从服务器端收到,这个业务流程的发送是早些时候创建的。
同时,你可以确保从服务器接收消息不仅仅是作为对我们的一些请求的反应而发生。其他用户的行为也会引起它们。为了测试这一点,你可以在另一个标签中使用另一个用户的认证令牌建立一个连接。来自服务器的通知消息将被发送到所有有活动连接的标签。
消息传递的业务流程
现在你可以继续开发WebSocket的功能,并为消息传递创建一个业务流程。顺便说一下,你现在可以发送消息,但如果不首先创建逻辑,这就没有意义,消息不会导致任何反应。因此,让我们回到端点设置,为触发器创建一个业务流程。 receive触发器的业务流程。
在许多方面,它将与之前的业务流程类似。当收到一条消息时,有必要生成一个 chat_event并向所有聊天参与者发送有关通知。不同的是,消息本身将需要被添加到chat_event ,而消息的作者不需要被包含在邮件列表中。
业务流程的第一部分也使用了同样的块。在 Make chat_event块中,你需要设置 type = message并从开始块中附上消息本身。
在循环中,我们需要检查 (Equal块),只有当接收方的连接ID与发送方的连接ID不一致时才发送消息(If-Else = False).
你可以发布结果并开始测试。注意,消息本身是以 JSON格式,所以当使用消息变量时,它看起来会是这样的。
{"message":"Some text here"}
在这个例子中,你可以看到你收到一个聊天连接通知,发送你自己的消息(Hi!),并收到一个回应(Glad to see you!)
这样就完成了使用WebSockets进行聊天的基本后台的创建。你可以开始建立前端,开发你自己的实时消息应用程序。