Haskell作为REST服务器

Mar*_*rko 26 rest service haskell

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

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

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

搜索hackage并没有给我太多暗示.

优选纯haskell服务器的解决方案.

Mtn*_*ark 16

我最近写了一个内部使用的生产质量Web服务.我使用了以下包:

  • CGIFastCGI - 用于基本Web服务器接口
  • UrlDisp - 用于基于URL的调度
  • HDBCHDBC-mysql - 用于数据库访问
  • hexpat - 用于XML解析(某些请求/响应是基于XML的)
  • parsec - 用于配置文件解析(在服务器端)
  • 二进制和/或谷物 - 用于二进制数据解析(一些请求/响应是基于二进制的)(虽然我现在可能使用attoparsec)

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

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

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

有几个Haskell纯服务器.大多数都有自己的服务代码API,尽管它们都很相似.看一眼:

这可能有很多东西可以咀嚼.让我们知道怎么回事!

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


mrs*_*eve 11

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

我认为今天的大多数Web开发都是使用yesod或snap框架工作完成的.两者都非常好,非常好发展(感谢所有参与的人!!).还有包装包装.

我的小REST示例(或者是非常好的服务器).(好吧也许这个例子不是一个真正的宁静服务器,但它显示了你如何处理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"
Run Code Online (Sandbox Code Playgroud)


rek*_*ado 9

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