[英]Haskell Servant and streaming
我正在嘗試向我的servant
服務器添加一個功能,該功能將從Amazon S3獲取文件並將其傳回給用戶。 因為文件可能很大,我不想在本地下載它們然后將它們提供給客戶端,我寧願將它們直接從S3流式傳輸到客戶端。
我使用Amazonka
來處理S3,我可以獲得一個S3文件的流作為Conduit
器。
但現在我不知道如何從Sink
到EitherT ServantErr IO a
。
任何人都可以解釋我該怎么做或向我展示如何做到這一點的一些例子?
仆人無需開箱即用,但所有需要的部件都可用。
在我們開始之前,我想,如果你可以流至水槽,這意味着你有一個源( gorsBody
的GetObjectResponse
是RsBody
,這是一個Source)
首先,Servant通過創建一個新的HasServer
實例為我們提供了添加對新返回類型的支持的可能性,因此我們可以提供EitherT ServantErr IO (Source ...)
並讓它流。
要創建該實例,我們必須實現route :: Proxy layout -> Server layout -> RoutingApplication
。 在這種情況下, Server layout
只是意味着EitherT ServantErr IO layout
, layout
是我們想要服務器的源,所以它是返回源的函數(並且可能因HTTP錯誤而失敗)。
我們必須返回一個RoutingApplication
,它是(以連續樣式)一個函數,它接受一個Request
並返回一個RouteResult Response
,這意味着一個不匹配的路由錯誤或一個響應。 Request
和Response
都是標准的wai,而不是Servant,因此我們現在可以查看生態系統的其余部分以了解如何實現它。
幸運的是,我們不必走遠: Network.Wai.Conduit
包含我們實現route
功能所需的內容: responseSource
獲取狀態值,一些響應頭和您的源,並為您提供Response
。
所以,這是相當多的工作要做,但我們需要的一切都在那里。 查看實例HasServer * (Get ...)
可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.