Haskell 如何使用Warp和Aeson通过HTTP交付JSON

Haskell 如何使用Warp和Aeson通过HTTP交付JSON,haskell,aeson,haskell-warp,Haskell,Aeson,Haskell Warp,我想创建一个在Haskell上运行的基于HTTP的高性能API,并将其用作HTTP后端 服务器应根据请求返回JSON数据。该数据应使用 但是,warp需要一个响应对象,而Aeson返回lazyByteStrings 如何将两个库连接在一起?对于这个问题的范围,我对查询解析或路由不感兴趣,但对如何将两个库绑定在一起以提供具有正确头的正确JSON的示例感兴趣 注意:这个问题故意没有显示任何研究成果,因为它是以问答式的方式回答的。如果您需要进行研究,请参阅我的答案。我将在基础上构建我的示例 为了简单起

我想创建一个在Haskell上运行的基于HTTP的高性能API,并将其用作HTTP后端

服务器应根据请求返回JSON数据。该数据应使用

但是,warp需要一个响应对象,而Aeson返回lazy
ByteString
s

如何将两个库连接在一起?对于这个问题的范围,我对查询解析或路由不感兴趣,但对如何将两个库绑定在一起以提供具有正确头的正确JSON的示例感兴趣


注意:这个问题故意没有显示任何研究成果,因为它是以问答式的方式回答的。如果您需要进行研究,请参阅我的答案。

我将在基础上构建我的示例

为了简单起见,我删除了任何类似路由的代码,用存根和注释替换了最相关的部分

在本例中,我们将序列化的JSON数据是列表
[“a”、“b”、“c”]
。对于任何URL,都将返回相同的响应(=JSON)

连接这两个库的问题是,虽然warp需要一个Blaze来正确构建其响应,但Aeson返回(如您所说)一个懒惰的
ByteString
。 调用将两者连接在一起的适当函数

{-#语言重载字符串}
导入数据.Aeson
导入数据。文本(Text)
导入网络.Wai
导入Network.Wai.Handler.Warp
导入Network.HTTP.Types(status200)
导入Network.HTTP.Types.Header(hContentType)
导入Blaze.ByteString.Builder.ByteString(来自lazybytestring)
将合格数据.ByteString.UTF8作为BU导入
main=do
让端口=3000
putStrLn$“侦听端口”++显示端口
运行端口应用程序
应用程序::应用程序
应用程序请求f=f$
案例路径信息请求
--在此放置自定义路线
_->任何路线
--将转换为JSON的数据
jsonData=[“a”、“b”、“c”]:[文本]
anyRoute=responseLBS
状态200
[(hContentType,“应用程序/json”)]
(编码jsonData)

2015年1月5日更新:修复Warp/WAI 3.x的示例

请注意,WAI提供了一个
responseLBS
功能,可自动为您添加来自Lazybytestring的
。最好还是坚持使用
Network.Wai
中的构造函数,这样就可以避免导入
.Internal
模块。@MichaelSnoyman感谢您注意到这一点!我编辑了上面的代码以使用
responseLBS
@UliKöhler。我在
app req=return$
行上得到一个错误,它说
无法将类型“Response”与“IO responseeceived”匹配预期类型:应用程序实际类型:Request
将其更改为该类型:
app req Response=Response$
@CalvinCheng我相信这与WARP 3.x中的API更改有关。我将在未来几天内调查此事!因为
应用程序
类型需要
请求
参数以及
响应
参数?参考文献-