1

我正在研究 Swift Vapor 框架。

我正在尝试创建一个控制器类,它将在 SSL 链接上获得的数据映射到第三方系统(Asterisk PBX 服务器..)到响应主体,该响应主体在一段时间内发送到客户端。

因此,我需要在接收到的文本行(在 SSL 连接上单独获得)进入时发送它们,而无需等待构建“完整响应”。

看到这个例子:

return Response(status: .ok) { chunker in
  for name in ["joe\n", "pam\n", "cheryl\n"] {
      sleep(1)
      try chunker.send(name)
  }

  try chunker.close()
}

我想这可能是要走的路。

但是我看到连接到 Vapor 服务器的是 REST 调用等待循环完成,然后才收到三行作为结果。

如何在不先等待循环完成的情况下让 try chunker.send(name) 将其字符发送回客户端?

在实际代码中,控制器方法可能会长时间保持与客户端的 HTTP 连接打开,并在获得 Asterisk 活动数据后立即将其发送给客户端。所以每个 .send(name) 实际上应该立即将数据传递给客户端,而不是等待最终的 .close() 调用。

添加 try chunker.flush() 并没有产生更好的结果..

4

1 回答 1

1

HTTP 请求并不是真正设计成那样工作的。不同的浏览器和客户端会根据其实现的不同而发挥不同的作用。

例如,如果您连接telnet到您粘贴的 chunker 示例,您将看到每秒发送一次数据。但另一方面,Safari 会在显示之前等待整个响应。

如果你想可靠地发送这样的分块数据,你应该使用为它设计的协议,如 WebSockets。

于 2016-12-20T01:54:42.867 回答