2010-04-06 15 views
26

Mi piacerebbe provare Haskell su un progetto piccolo che dovrebbe essere adatto a questo. Mi piacerebbe usarlo come un backend per una piccola applicazione Ajax.Haskell come server REST

Il backend Haskell deve essere in grado di eseguire l'autenticazione (base, modulo, qualsiasi cosa, ...), tenere traccia della sessione utente (non molti dati tranne il nome utente) e inviare richiesta ai gestori in base a uri e tipo di richiesta . Dovrebbe anche essere in grado di serializzare la risposta a entrambi i formati xml e json, a seconda del parametro di richiesta.

Suppongo che i gestori siano ideali per Haskell, poiché il servizio è fondamentalmente senza stato, ma non so da dove iniziare per il resto della storia.

La ricerca di hackage non mi ha dato molti spunti.

La soluzione per server haskell puro sarebbe preferibile.

risposta

16

Ho recentemente scritto un servizio Web di qualità di produzione per uso interno.Ho usato i seguenti pacchetti:

  • CGI & FastCGI - per il server Web di base di interfacciamento
  • UrlDisp - per URL basati dispacciamento
  • HDBC & HDBC-mysql - per l'accesso al database
  • hexpat - per XML parsing (alcuni richieste/risposte basate su XML)
  • parsec - per file di configurazione parsing (sul lato server)
  • binary &/o cereal - per i dati binari parsing (alcune richieste/risposte si basavano binario) (anche se probabilmente sarei uso attoparsec ora)

Inoltre, per un diverso progetto, sto anche utilizzando:

  • xhtml - XHTML biblioteca Combinator

Nessuno di questi sono l'h componenti di altissimo livello disponibili per Haskell, ma sono tutti abbastanza fattibili e abbastanza completi. Ho evitato le astrazioni di livello superiore poiché dovevo inserirle in un sistema più grande esistente e questi pacchetti funzionano proprio come i componenti simili che ho usato in altri progetti di servizi web.

Ho eseguito il servizio come gestore basato su fastCGI per Apache2 w/mod_fcgid. Questo sembra essere un set affidabile ed efficiente. Suppongo che un server basato su Haskell, compilato insieme al servizio potrebbe essere più veloce, ma questo era abbastanza ragionevole con pochissimo lavoro. Ho ottenuto> 1.400 richieste al secondo su un server quad-cpu, 2.6GHz, Linux.

Esistono diversi server Haskell puri. La maggior parte ha le proprie API per il proprio codice di servizio, anche se sono tutte molto simili. Date un'occhiata a:

Probabilmente c'è molto da masticare. Fateci sapere come va!

Nel frattempo, se si desiderano ulteriori informazioni è possibile visitare il HaskellWiki.

+1

Giusto per chiarire: hyena in realtà non usa il pacchetto wai, sebbene abbia un'interfaccia simile. Se stai cercando un server basato su wai, dovresti usare Warp. –

+0

@MichaelSnoyman come hai misurato rps? –

2

Non sono sicuro di quale livello di livello si stia tentando di percorrere. Se si desidera scrivere il proprio server si potrebbe iniziare da qualcosa di simile: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

In alternativa, se siete alla ricerca di una struttura pre-costruito si potrebbe provare Happs: http://happs.org/

C'è anche un rubino -Porta-Rails. Turbinado o qualcosa del genere.

Infine, ci sono alcuni tutorial introduttivi con tipo CGI. Ho usato questo: http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell (è stato anche suggerito nella risposta di @ mdm)

Buona fortuna!

2

Ci sono alcuni link utili in this question "Qual è l'ecosistema per lo sviluppo web di Haskell?"

11

È ora maggio 2011, solo un aggiornamento sulle tendenze attuali.

Penso che la maggior parte dello sviluppo web oggi sia fatta con yesod o il lavoro con il telaio a scatto. entrambi sono molto buoni e sviluppati molto bene (grazie a tutte le persone coinvolte !!). inoltre c'è anche il pacchetto wrap.

Il mio piccolo esempio REST (o server resful). (ok forse l'esempio non è un server veramente riposante, ma mostra come puoi gestire le richieste GET/PUT, il resto dipende da te ..)

Se apri http://localhost:8000/mytest in un browser, quindi "Richiedi richiesta" È visualizzato. Se si effettua una richiesta PUT con un rest-client (anche su localhost: 8000/mytest), il contenuto del corpo della richiesta viene memorizzato in "/tmp/restrq.txt".

Questo codice è parte del file Site.hs della Snap-quadro:

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

Non sono sicuro sui server puri, ma per i piccoli progetti, che non hanno bisogno di un vero e proprio framework web, uso la libreria WAI, che è anche usata dal framework Yesod.

In ogni caso, anche se la vostra applicazione è semplice, suggerirei un framework reale, perché i framework web Haskell non sono solitamente una grande libreria di cose predefinite, ma solo forniscono un concetto pulito per le applicazioni web, siano esse semplici guestbook o intere applicazioni della comunità abilitate per AJAX.

9

Per un server che implementa un'API JSON sto usando scotty, che si basa su WAI + Warp. È incredibilmente facile da usare, in particolare se hai già creato applicazioni con Sinatra.

Problemi correlati