代码之家  ›  专栏  ›  技术社区  ›  Marko

haskell作为rest服务器

  •  26
  • Marko  · 技术社区  · 15 年前

    我想试试哈斯克尔的一个小项目,应该很适合它。 我想将它用作一个小型ajax应用程序的后端。

    haskell后端应该能够进行身份验证(basic,form,whatever,…),跟踪用户会话(除了用户名之外,没有多少数据),并根据uri和请求类型将请求发送给处理程序。它还应该能够将响应序列化为XML和JSON格式,具体取决于请求参数。

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

    搜索hackage没有给我多少提示。

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

    7 回复  |  直到 11 年前
        1
  •  16
  •   Robert    11 年前

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

    另外,对于另一个项目,我还使用:

    这些都不是haskell可用的最高级别组件,但它们都是非常可行和相当完整的。我避免了更高级别的抽象,因为我需要将其安装到现有的更大系统中,而且这些包的工作原理与我在其他web服务项目中使用的类似组件一样。

    我用fastcgi作为apache2的基于fastcgi的处理程序运行了这个服务。这似乎是一个可靠和有效的设置。我想基于haskell的服务器与服务一起编译可能会更快,但这是非常合理的,只需很少的工作。我在一个2.6ghz的四CPU Linux服务器上每秒收到1400个请求。

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

    这可能是一个很大的咀嚼。告诉我们进展如何!

    同时,如果您需要更多信息,可以访问 HaskellWiki .

        2
  •  11
  •   mrsteve    13 年前

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

    我认为现在大多数的web开发都是用yesod或者snap框架来完成的。两者都是非常好和非常好的发展(感谢所有参与的人!!)。此外还有包装袋。

    我的小rest示例(或resful服务器)。(好吧,也许这个例子不是一个真正的restful服务器,但是它展示了如何处理get/put请求,剩下的就看你了。)

    如果你打开 http://localhost:8000/mytest 在浏览器中,将显示“获取请求”。如果您使用rest客户机(也对localhost:8000/mytest)发出put请求,那么请求正文的内容存储在“/tmp/restq.txt”中。

    此代码是snap框架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"
    
        3
  •  9
  •   rekado    12 年前

    对于实现json api的服务器 scotty ,它建立在wai+warp上。它非常容易使用,特别是如果您以前用sinatra构建过应用程序。

        4
  •  2
  •   Tim Perry    15 年前

    我不知道你想说什么。如果要编写自己的服务器,可以从以下内容开始: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

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

    还有一个ruby on rails端口。 Turbinado 或者别的什么。

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

    祝你好运!

        5
  •  2
  •   Community CDub    8 年前

    中有一些有用的链接 this question “Haskell Web开发的生态系统是什么?”

        6
  •  2
  •   ertes    13 年前

    我不确定是否是纯服务器,但对于不需要完整web框架的小型项目,我使用wai库,yesod框架也使用wai库。

    无论如何,即使您的应用程序很简单,我还是建议您使用一个真正的框架,因为haskell web框架通常不是一个包含预定义内容的大型库,而是为web应用程序提供一个干净的概念,无论是简单的留言簿还是整个支持ajax的社区应用程序。操作。

        7
  •  1
  •   mdm Mr. Sajid Shaikh    15 年前

    Practical web programming in Haskell . 有两个模块很有用,text.xhtml和network.cgi。