2010-04-06 112 views
26

我想嘗試一個Haskell應該很適合它的小項目。 我想用它作爲一個小ajax應用程序的後端。Haskell作爲REST服務器

Haskell後端應該能夠進行身份驗證(基本,形式,任何,...),跟蹤用戶會話(除用戶名外沒有太多數據),並根據uri和請求類型將請求分派給處理程序。它也應該能夠將響應序列化爲xml和json格式,具體取決於請求參數。

我想處理程序非常適合Haskell,因爲服務基本上是無狀態的,但我不知道從哪裏開始講故事的其餘部分。

搜索hackage並沒有給我太多提示。

純haskell服務器的解決方案將是首選。

回答

16

我最近編寫了一個內部使用的生產質量的Web服務。我用下面的包:

  • CGI & FastCGI - 基本的web服務器接口
  • UrlDisp - 對於基於URL的調度
  • HDBC & HDBC-mysql - 數據庫訪問
  • hexpat - 用於XML解析(有些請求/響應是基於XML的)
  • parsec - 用於配置文件解析(服務器端)
  • binary & /或cereal - 二進制數據解析(一些請求/響應都是基於二進制)(雖然我可能會使用attoparsec現在)

此外,對於不同項目,我還使用:

  • xhtml - XHTML組合子庫的這些

沒有一個是爲H Haskell可用的最高級別組件,但它們都非常可行且相當完整。我避免了更高級別的抽象,因爲我需要將它應用到現有的更大的系統中,這些包就像我在其他Web服務項目中使用的類似組件一樣工作。

我將服務作爲基於fastCGI的Apache2 w/mod_fcgid處理程序運行。這似乎是一個可靠和有效的設置。我想一個基於Haskell的服務器與服務一起編譯可能會更快,但是這非常合理,只需很少的工作。我在四核CPU,2.6GHz,Linux服務器上每秒獲得1,400個請求。

有幾個Haskell純服務器。大多數服務代碼都有自己的API,但它們都非常相似。看一看:

這可能是很多咀嚼。讓我們知道怎麼回事!

同時,如果您想了解更多信息,您可以訪問HaskellWiki。 「

+1

只是澄清:鬣狗實際上並沒有使用wai軟件包,儘管它有一個類似的界面。如果你正在尋找一個基於wai的服務器,你應該使用Warp。 – 2011-09-12 19:40:16

+0

@MichaelSnoyman你是怎麼測量rps的? – 2012-12-23 23:40:15

2

我不知道你試圖去的程度有多低。如果你想編寫自己的服務器,你可以開始從這樣的事情: 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的回答中建議)

祝你好運!

11

現在是2011年5月,只是對當前趨勢的更新。

我認爲今天大多數web開發都是通過yesod或快照框架來完成的。兩者都非常好,非常好(感謝所有參與的人!!)。此外還有包裝包裝。

我的小REST示例(或resful服務器)。 (好吧,也許這個例子不是一個真正的寧靜的服務器,但它顯示瞭如何處理GET/PUT請求,其餘部分取決於你..)

如果你在瀏覽器中打開http://localhost:8000/mytest,那麼「Get request」被展示。如果使用rest-client(也是localhost:8000/mytest)發出PUT請求,則請求主體的內容將存儲在「/tmp/restrq.txt」中。

此代碼是管理單元框架的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" 
2

我不知道的是純粹的服務器,但對於小項目,並不需要一個完整的web框架,我使用WAI庫,這也是Yesod框架所使用的。無論如何,即使你的應用程序很簡單,我也會建議一個真正的框架,因爲Haskell web框架通常不是一個預定義的東西的大型庫,而只是爲web應用程序提供一個乾淨的概念,不管它們是簡單的留言簿或整個支持AJAX的社區應用程序。

9

對於實現JSON API的服務器,我使用的是基於WAI + Warp的scotty。這非常容易使用,特別是如果您以前使用Sinatra構建應用程序。