How to deliver JSON over HTTP using Warp with Aeson

北战南征 提交于 2019-12-01 08:55:18

I'll build my example on the HaskellWiki minimal warp example.

For the sake of simplicity I removed any code like routing, replacing the most relevant parts by stubs and comments where to place what.

The JSON data we will serialize in this example is the list ["a","b","c"]. The same response (= the JSON) will be returned for any URL.

The issue in connecting both libraries is that while warp requires a Blaze Builder to build its response properly, while Aeson returns (as you said) a lazy ByteString. The appropriate function to connect both together is called 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)

Update 05/01/2015: Fix example for Warp/WAI 3.x

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!