如何在Swift Vapor中生成具有异步创建的主体块的响应体

时间:2016-12-17 19:48:58

标签: swift server vapor http-chunked

我正在研究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调用在收到三行之前等待循环完成。

如何尝试chunker.send(name)将其字符发送回客户端而不先等待循环完成?

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

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

1 个答案:

答案 0 :(得分:1)

HTTP请求实际上并不像那样工作。不同的浏览器和客户端将根据其实现而有所不同。

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

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