如何在 Swift Vapor 中使用异步创建的正文块生成响应正文

How to produce a response body with asynchronously created body chunks in Swift Vapor

我正在研究 Swift Vapor 框架。

我正在尝试创建一个控制器 class,它将在 SSL link 上获得的数据映射到第三方系统(Asterisk PBX 服务器..)到通过有时间给客户。

所以我需要在收到文本行(通过 SSL 连接单独获得)时发送它们,而不用等待构建 'complete response'。

看到这个例子:

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 activity 数据就发送给客户端。所以每个 .send(name) 实际上应该立即将数据传递给客户端,而不是等待最后的 .close() 调用。

添加尝试 chunker.flush() 没有产生任何更好的结果..

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

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

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