【问题标题】:Haskell Servant and streamingHaskell Servant 和流媒体
【发布时间】:2016-01-24 09:45:13
【问题描述】:

我正在尝试向我的servant 服务器添加一项功能,该功能将从 Amazon S3 获取文件并将其流式传输回给用户。 因为文件可能很大,我不想在本地下载它们然后将它们提供给客户端,我宁愿将它们直接从 S3 流式传输到客户端。

我使用Amazonka 来处理我对S3 所做的事情,并且我可以将S3 文件的流作为Conduit 接收器。

但现在我不知道如何从SinkEitherT ServantErr IO a

谁能解释一下怎么做或者给我看一些例子来说明怎么做?

【问题讨论】:

标签: haskell amazon-s3 servant


【解决方案1】:

Servant 没有开箱即用的功能,但是所有需要的部件都可用。

在我们开始之前,我猜如果你可以流式传输到 Sink,那意味着你有一个源(GetObjectResponsegorsBody 是一个RsBody,它是一个源)

首先,通过创建HasServer 的新实例,Servant 为我们提供了添加对新返回类型的支持的可能性,因此我们可以提供EitherT ServantErr IO (Source ...) 并使其流式传输。

要创建该实例,我们必须实现route :: Proxy layout -> Server layout -> RoutingApplicationServer layout,在这种情况下,只是意味着 EitherT ServantErr IO layoutlayout 是我们想要服务的源,所以它是返回源的函数(并且可能会因 HTTP 错误而失败)。

我们必须返回一个RoutingApplication,它是一个(以延续风格)接受Request 并返回RouteResult Response 的函数,这意味着要么是不匹配的路由错误,要么是响应。 RequestResponse 都是标准的 wai,而不是 Servant,所以我们现在可以看看生态系统的其他部分来了解如何实现它。

幸运的是,我们不必走太远:Network.Wai.Conduit 包含实现 route 函数所需的内容:responseSource 接受状态值、一些响应标头和您的来源,并为您提供 @987654345 @。

所以,这是很多工作要做,但我们需要的一切都在那里。查看source of the instance HasServer * (Get ...) 可能会有所帮助。

【讨论】:

  • 我认为添加关于如何在 WAI 级别执行此操作的解释/参考会很好,以便了解这如何适合仆人级别。对我来说,不清楚route 返回的内容以及如何考虑此处的延续样式设置。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 2012-06-07
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多