问题 haskell中的Web服务框架


首先,我对Haskell很新 - 但我必须说自从我开始玩它以来我爱上了这门语言。我做了大量的C,Java,python和perl。 Haskell肯定在我身上成长。我在perl / python中为我的一个个人项目编写了一个web应用程序/服务 - 我想知道我是否可以将它作为一个有趣的项目转移到haskell并做一些haskell hackery来看它是如何演变的。

我知道haskell中有一些优秀的Web应用程序框架。我想做的是有一个用haskell编写的服务,它将以不同的格式(SOAP,REST-xml,REST-json)响应数据。我使用javascript来构建DOM等。所以我的问题是,我可以使用任何库来转换动态数据的格式吗?或者考虑到场景,你会如何在哈斯克尔进行呢?

自2008年以来,我没有玩过这个项目,我最初的想法是使用java社区中的apacheCXF并在java中编写所有代码。但我很想在哈斯克尔做这件事。有什么提示吗?


2342
2017-07-12 12:04


起源

看到 stackoverflow.com/questions/5645168/... - Don Stewart


答案:


我用Happstack编写了类似的东西。

我所做的是创建一个类型来表示我的Web应用程序的所有可能的响应。

data AppResponse = Foo String Int | Bar [String] | etc

然后编写我的处理程序以返回此类型的值:

home :: ServerPart AppResponse
user :: UserId -> ServerPart AppResponse

等等,

然后我编写了以不同格式呈现响应的函数:

jsonResponse :: AppResponse -> JSON
xmlResponse  :: AppResponse -> XML

等等

然后有一个简单的过滤器,看着 Accept 标头并决定使用哪些转换函数。

这种方法很好,因为:

  1. 大多数代码不需要知道任何有关响应格式的内容(xml,json等)
  2. 要添加新格式,您只需编写新功能, newFormatResponse :: AppResponse -> NewFormat。该 AppResponse 键入每个可能的响应的详细信息,因此您不必搜索所有代码,找出甚至可能的响应。

8
2017-07-13 20:56





有一个 haskellwiki页面 致力于这个主题。在这些当中 HappStack 和 耶索德 是最成熟的。对于初学者,我建议 HappStack 因为Yesod使用了很多 QuasiQuotes 魔法。

HappStack 在它的状态模块中只有一些魔力。据我所知,这将在HappStack 7中被改变,在那里它将被改为使用MACID商店,它不那么神奇,并且具有较少的样板。

如果你想要一些简单的东西,你应该看看 Snap框架


6
2017-07-12 12:30



请注意,Yesod的大部分魔力是:1)可选2)安全使用而不用担心它是如何工作的3)非常方便。这比品味更重要。 - C. A. McCann
@camccan我同意你的意见; Yesods魔法没有错。我虽然初学者处理Haskell和它的语法扩展可能是个问题。情况可能并非如此,而且可能仅仅是我对香草Haskell的喜爱。 - HaskellElephant