【问题标题】:Haskell as REST serverHaskell 作为 REST 服务器
【发布时间】:2011-02-04 20:01:02
【问题描述】:

我想在一个非常适合它的小型项目上尝试 Haskell。 我想将它用作小型 ajax 应用程序的后端。

Haskell 后端应该能够进行身份验证(基本、表单等,...),跟踪用户会话(除了用户名之外没有太多数据)并根据 uri 和请求类型向处理程序发送请求。它还应该能够将响应序列化为 xml 和 json 格式,具体取决于请求参数。

我认为处理程序非常适合 Haskell,因为该服务基本上是无状态的,但我不知道从哪里开始。

搜索 hackage 并没有给我太多提示。

首选纯 haskell 服务器的解决方案。

【问题讨论】:

    标签: rest haskell service


    【解决方案1】:

    我最近编写了一个供内部使用的生产质量网络服务。我使用了以下软件包:

    • CGI & FastCGI — 用于基本的 Web 服务器接口
    • UrlDisp — 用于基于 URL 的调度
    • HDBC & HDBC-mysql — 用于数据库访问
    • hexpat — 用于 XML 解析(一些请求/响应是基于 XML 的)
    • parsec — 用于配置文件解析(在服务器端)
    • binary &/或 cereal — 用于二进制数据解析(一些请求/响应是基于二进制的)(尽管我现在可能会使用 attoparsec)

    另外,对于不同的项目,我也在使用:

    • xhtml — XHTML 组合库

    这些都不是 Haskell 可用的最高级别的组件,但它们都非常实用且相当完整。我避免使用更高级别的抽象,因为我需要将其放入现有的更大系统中,并且这些包的工作方式与我在其他 Web 服务项目中使用的类似组件一样。

    我将该服务作为基于 fastCGI 的 Apache2 w/mod_fcgid 处理程序运行。这似乎是一种可靠且有效的设置。我想一个基于 Haskell 的服务器,与服务一起编译可能会更快,但这是非常合理的,只需很少的工作。我在四核、2.6GHz、Linux 服务器上每秒收到超过 1,400 个请求。

    有几个 Haskell 纯服务器。大多数都有自己的服务代码 API,尽管它们都非常相似。看看:

    这可能有很多值得细细琢磨的。告诉我们进展如何!

    同时,如果您想了解更多信息,可以访问HaskellWiki。

    【讨论】:

    • 澄清一下:鬣狗实际上并没有使用 wai 包,尽管它有一个类似的界面。如果您正在寻找基于 wai 的服务器,您应该使用 Warp。
    【解决方案2】:

    对于实现 JSON API 的服务器,我使用的是 scotty,它基于 WAI+Warp 构建。它非常易于使用,特别是如果您以前使用 Sinatra 构建过应用程序。

    【讨论】:

      【解决方案3】:

      我不确定纯服务器,但对于不需要成熟的 Web 框架的小型项目,我使用 WAI 库,Yesod 框架也使用该库。

      不管怎样,即使你的应用程序很简单,我也会推荐一个真正的框架,因为 Haskell Web 框架通常不是一个包含预定义内容的大型库,而只是为 Web 应用程序提供一个干净的概念,可以是简单的留言簿或整个支持 AJAX 的社区应用程序。

      【讨论】:

        【解决方案4】:

        现在是 2011 年 5 月,只是对当前趋势的更新。

        我认为当今大多数 Web 开发都是使用 yesod 或 snap 框架完成的。两者都非常好并且开发得非常好(感谢所有参与其中的人!!)。此外还有 wrap 包。

        我的小型 REST 示例(或 resful 服务器)。 (好吧,也许这个例子不是一个真正的宁静服务器,但它展示了你如何处理 GET/PUT 请求,剩下的就看你了..)

        如果您在浏览器中打开http://localhost:8000/mytest,则会显示“获取请求”。如果您使用 rest-client(也向 localhost:8000/mytest)发出 PUT 请求,请求正文的内容将存储在“/tmp/restrq.txt”中。

        此代码是 Snap-Framework 的 Site.hs 文件的一部分:

        - | Constants
        tempFilePath :: String
        tempFilePath = "/tmp/restrq.txt"
        
        
        -- | Helper Functions
        
        -- Bytestring Conversion
        strictToLazy :: B.ByteString -> BL.ByteString
        strictToLazy x
          | B.null x = BL.Empty
          | otherwise = BL.Chunk x BL.Empty
        
        lazyToStrict :: BL.ByteString -> B.ByteString
        lazyToStrict = B.concat . BL.toChunks
        
        getRequestString :: MonadSnap m => m B.ByteString
        getRequestString = do message <- getRequestBody
                              return (lazyToStrict message)
        
        
        -- | Action for PUT request
        action :: Application ()
        action = do message <- getRequestString
                    liftIO $ B.writeFile tempFilePath (B8.append (B8.pack "--- REST BODY ---\n") message)
        
        -- | /mytest (GET and PUT requests possible)
        mytest :: Application ()
        mytest = method GET (writeBS "Get request") <|> method PUT action
        
        
        -- | The main entry point handler.
        site :: Application ()
        site = route [ ("/",            index)
                     , ("/mytest", mytest)
                     ]
               <|> serveDirectory "resources/static"
        

        【讨论】:

          【解决方案5】:

          有一些有用的链接 this question "Haskell web 开发的生态系统是什么?"

          【讨论】:

            【解决方案6】:

            我不确定你想达到多低的水平。如果您想编写自己的服务器,您可以从以下内容开始: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

            或者,如果您正在寻找预构建的框架,您可以尝试 HApps: http://happs.org/

            还有一个 Ruby-On-Rails 端口。 Turbinado 什么的。

            最后,还有一些 CGI 类型的入门教程。我用过这个: http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell(@mdm 的回答中也有建议)

            祝你好运!

            【讨论】:

              【解决方案7】:

              Practical web programming in Haskell。您会发现有几个模块很有用,Text.XHtml 和 Network.CGI。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-05-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-28
                • 1970-01-01
                • 1970-01-01
                • 2013-02-22
                相关资源
                最近更新 更多