我正在研究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()没有产生任何更好的结果..
答案 0 :(得分:1)
HTTP请求实际上并不像那样工作。不同的浏览器和客户端将根据其实现而有所不同。
例如,如果您使用telnet
连接到您粘贴的chunker示例,您将看到数据每秒发送一次。但另一方面,Safari会在显示之前等待整个响应。
如果您想要可靠地发送这样的分块数据,您应该使用为其设计的协议,如WebSockets。