Uli*_*ler 3 haskell aeson haskell-warp
我想使用warp作为HTTP后端创建在Haskell上运行的基于HTTP的高性能API 。
服务器应根据请求返回JSON数据。此数据应通过使用Aeson进行序列化
但是,warp需要一个响应对象,而Aeson返回lazy ByteString。
如何将两个库绑定在一起?对于这个问题的范围,我对查询解析或路由不感兴趣,但是在一个示例中,如何将两个库绑定在一起以提供带有正确标头的正确JSON。
注意:这个问题有意不显示任何研究成果,因为它被回答为“问答式”。如果您需要研究工作,请参阅我的回答。
我将在HaskellWiki最小扭曲示例上构建示例。
为了简单起见,我删除了诸如路由之类的所有代码,并通过存根和注释将最相关的部分替换在何处。
我们将在此示例中序列化的JSON数据是list ["a","b","c"]。对于任何URL,都将返回相同的响应(= JSON)。
连接这两个库的问题是,warp需要Blaze Builder正确构建其响应,而Aeson返回(如您所说)是lazy ByteString。将两者连接在一起的适当功能称为fromLazyByteString。
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Text (Text)
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)
import Blaze.ByteString.Builder.ByteString (fromLazyByteString)
import qualified Data.ByteString.UTF8 as BU
main = do
let port = 3000
putStrLn $ "Listening on port " ++ show port
run port app
app :: Application
app req f = f $
case pathInfo req of
-- Place custom routes here
_ -> anyRoute
-- The data that will be converted to JSON
jsonData = ["a","b","c"] :: [Text]
anyRoute = responseLBS
status200
[(hContentType, "application/json")]
(encode jsonData)
Run Code Online (Sandbox Code Playgroud)
2015年5月1日更新: Warp / WAI 3.x的修复示例
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |