2010-04-06 15 views
26

Ich möchte Haskell auf einem kleinen Projekt versuchen, das gut dafür geeignet sein sollte. Ich möchte es als Backend zu einer kleinen Ajax-Anwendung verwenden.Haskell als REST-Server

Haskell Backend sollte in der Lage sein, Authentifizierung (Basic, Form, was auch immer, ...), verfolgen Benutzersitzung (nicht viele Daten außer Benutzername) und an Handler nach URI und Anfrage Typ Anfrage zu senden . Es sollte auch in der Lage sein, die Antwort je nach Anforderungsparameter sowohl auf das xml- als auch auf das json-Format zu serialisieren.

Ich nehme an, die Handler sind ideal für Haskell geeignet, da der Dienst im Grunde zustandslos ist, aber ich weiß nicht, wo ich anfangen soll für den Rest der Geschichte.

Suchen von Hacker gab mir nicht viele Hinweise.

Lösung für reinen Haskell-Server wäre bevorzugt.

Antwort

16

Ich habe vor kurzem einen Webservice in Produktionsqualität für den internen Gebrauch geschrieben.Früher habe ich die folgenden Pakete:

  • CGI & FastCGI - für grundlegende Web-Server
  • UrlDisp Schnittstelle - für URL-basierte Disposition
  • HDBC & HDBC-mysql - für den Datenbankzugriff
  • hexpat - für das Parsen von XML (einige Anfragen/Antworten waren XML-basiert)
  • parsec - für die Konfigurationsdatei Parsen (auf der Serverseite)
  • binary &/oder cereal - zum Parsen von Binärdaten (einige Anfragen/Antworten binär beruhten) (obwohl ich wahrscheinlich attoparsec würde jetzt verwenden)

Auch für einen anderen Projekt, ich bin auch mit:

  • xhtml - XHTML combinator Bibliothek

Keiner von ihnen sind die h höchste Level-Komponenten für Haskell, aber sie sind alle recht praktikabel und ziemlich vollständig. Ich vermied die Abstraktionen auf höherer Ebene, da ich diese in ein bestehendes größeres System einbauen musste, und diese Pakete funktionieren genauso wie ähnliche Komponenten, die ich in anderen Web-Service-Projekten verwendet habe.

Ich habe den Dienst als FastCGI-basierte Handler für Apache2 mit mod_fcgid ausgeführt. Dies scheint eine zuverlässige und effiziente Einrichtung zu sein. Ich nehme an, ein Haskell-basierter Server, der zusammen mit dem Dienst kompiliert wurde, könnte schneller sein, aber das war ziemlich vernünftig mit sehr wenig Arbeit. Ich habe> 1.400 Anfragen pro Sekunde auf einem Linux-Server mit Quad-CPU, 2.6GHz.

Es gibt mehrere reine Haskell-Server. Die meisten haben ihre eigenen APIs für Ihren Service-Code, obwohl sie alle ziemlich ähnlich sind. Schauen Sie sich auf:

Das ist wahrscheinlich eine Menge zu kauen. Lass es uns wissen wie es geht!

In der Zwischenzeit, wenn Sie weitere Informationen wünschen, können Sie die HaskellWiki besuchen.

+1

Nur um zu verdeutlichen: Hyäne verwendet das Wai-Paket eigentlich nicht, obwohl es eine ähnliche Schnittstelle hat. Wenn Sie nach einem Wai-basierten Server suchen, sollten Sie Warp verwenden. –

+0

@MichaelSnoyman wie hast du rps gemessen? –

2

Ich bin mir nicht sicher, wie niedrig Sie versuchen zu gehen. Wenn Sie Ihren eigenen Server schreiben wollen könnte man von so etwas wie dieses starten: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

Alternativ kann, wenn Sie einen vorgefertigten Rahmen suchen, könnte Sie Happs versuchen: http://happs.org/

Es gibt auch ein Ruby -On-Rails-Port. Turbinado oder so etwas.

Schließlich gibt es einige erste Tutorials mit CGI-Art. Ich habe dieses verwendet: http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell (Es wurde auch in @ mdm Antwort vorgeschlagen)

Viel Glück!

2

Es gibt einige nützliche Links in this question "Was ist das Ökosystem für Haskell Web-Entwicklung?"

11

Es ist jetzt Mai 2011, nur ein Update zu aktuellen Trends.

Ich denke, die meisten Web-Entwicklung ist heute mit Jaod oder der Snap-Frame-Arbeit erledigt. Beide sind sehr gut und sehr nett entwickelt (Danke an alle Beteiligten !!). Weiter gibt es auch das Wrap-Paket.

Mein kleines REST Beispiel (oder resful Server). (ok vielleicht ist das Beispiel kein wirklich erholsamer Server, aber es zeigt, wie Sie mit GET/PUT Anfragen umgehen können, der Rest liegt bei Ihnen ..)

Wenn Sie http://localhost:8000/mytest in einem Browser öffnen, dann "Get request" wird angezeigt. Wenn Sie eine PUT-Anfrage mit einem Rest-Client machen (auch an localhost: 8000/mytest), wird der Inhalt des Anfragetexts in "/tmp/restrq.txt" gespeichert.

Dieser Code ist Teil der Site.hs Datei des Snap-Framework:

- | 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

Ich bin nicht sicher über reinen Server, sondern auch für kleine Projekte, die einen vollwertigen nicht brauchen Web-Framework verwende ich die WAI-Bibliothek, die auch vom Jessod-Framework verwendet wird.

Wie auch immer, auch wenn Ihre Anwendung einfach ist, würde ich ein echtes Framework vorschlagen, weil Haskell Webframeworks in der Regel keine große Bibliothek vordefinierter Sachen sind, sondern nur ein sauberes Konzept für Webanwendungen, seien sie einfach Gästebücher oder ganze AJAX-fähige Community-Anwendungen.

9

Für einen Server, der eine JSON-API implementiert, verwende ich scotty, die auf WAI + Warp baut. Es ist unglaublich einfach zu verwenden, insbesondere wenn Sie bereits Anwendungen mit Sinatra erstellt haben.

Verwandte Themen