我将在HaskellWiki 最小扭曲示例上构建我的示例。
为了简单起见,我删除了任何代码,如路由,用存根替换最相关的部分,并在哪里放置什么的注释。
我们将在本例中序列化的 JSON 数据是 list ["a","b","c"]
。任何 URL 都将返回相同的响应(= JSON)。
连接这两个库的问题是,虽然warp需要 BlazeBuilder
才能正确构建其响应,而Aeson返回(如您所说)一个惰性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)
2015 年5 月 1 日更新:修正 Warp/WAI 3.x 的示例