2010-04-06 15 views
26

Me gustaría probar Haskell en un proyecto pequeño que debería ser adecuado para él. Me gustaría utilizarlo como un backend para una aplicación pequeña de Ajax.Haskell como servidor REST

El back-end de Haskell debería ser capaz de hacer autenticación (básica, forma, lo que sea ...), realizar un seguimiento de la sesión del usuario (no hay demasiados datos excepto el nombre de usuario) y enviar solicitudes a los manejadores basados ​​en uri y tipo de solicitud . También debería poder serializar la respuesta al formato xml y json, según el parámetro de solicitud.

Supongo que los manipuladores son ideales para Haskell, ya que el servicio es básicamente sin estado, pero no sé por dónde empezar para el resto de la historia.

Buscar hackage no me dio muchas pistas.

Sería preferible la solución para el servidor de haskell puro.

Respuesta

16

Recientemente he escrito un servicio web de calidad de producción para uso interno.He utilizado los siguientes paquetes:

  • CGI & FastCGI - para el servidor web básico de interfaz
  • UrlDisp - para el URL base de despacho
  • HDBC & HDBC-mysql - para el acceso a la base de datos
  • hexpat - para el análisis XML (algunos solicitudes/respuestas se basan en XML)
  • parsec - para el archivo de configuración analizar (en el lado del servidor)
  • binary &/o cereal - para los datos binarios de análisis sintáctico (algunas peticiones/respuestas se basan binario) (aunque probablemente me utilizo attoparsec ahora)

Además, para un diferente proyecto, también estoy usando:

  • xhtml - XHTML biblioteca combinador

Ninguno de estos son la h ighest componentes de nivel disponibles para Haskell, pero todos ellos son bastante factible y bastante completo. Evité las abstracciones de nivel superior ya que necesitaba para encajar esto en un sistema más grande existente, y estos paquetes de trabajo al igual que componentes similares que he usado en otros proyectos de servicios web.

Ejecuté el servicio como un controlador basado en FastCGI para Apache2 w/mod_fcgid. Esto parece ser una configuración confiable y eficiente. Supongo que un servidor basado en Haskell, compilado junto con el servicio podría ser más rápido, pero esto era bastante razonable con muy poco trabajo. Tengo> 1.400 solicitudes por segundo en un quad-cpu, 2,6 GHz, servidor Linux.

Hay varios servidores Haskell puros. La mayoría tiene sus propias API para su código de servicio, aunque todas son bastante similares. Echar un vistazo a:

Eso es probablemente mucho para masticar. ¡Háganos saber cómo va!

Mientras tanto, si desea obtener más información, puede visitar el HaskellWiki.

+1

Solo para aclarar: hyena en realidad no usa el paquete wai, aunque tiene una interfaz similar. Si está buscando un servidor basado en wai, debe usar Warp. –

+0

@MichaelSnoyman ¿cómo midiste rps? –

2

No estoy seguro de qué tan bajo nivel está tratando de llegar. Si desea escribir su propio servidor usted podría comenzar a partir de algo como esto: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

Alternativamente, si usted está buscando un marco pre-construidos que podría intentar Happs: http://happs.org/

También hay un rubí - Puerto en rieles. Turbinado o algo así.

Por último, hay algunos pasos para empezar con tutoriales de tipo CGI. He usado este: http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell (También se sugirió en la respuesta de @mdm)

¡Buena suerte!

2

Hay algunos enlaces útiles en this question "¿Cuál es el ecosistema para el desarrollo web de Haskell?"

11

Ahora es mayo de 2011, solo una actualización de las tendencias actuales.

Creo que la mayoría del desarrollo web hoy en día se hace con yesod o con el trabajo de fotogramas instantáneos. ambos son muy buenos y muy agradable (desarrollado gracias a todas las personas que están involucradas !!). más allá está también el paquete de envoltura.

Mi pequeño ejemplo REST (o servidor resful). (ok tal vez el ejemplo no es un servidor realmente relajante, pero muestra cómo se puede manejar las solicitudes GET/PUT, el resto depende de usted ...)

Si abre http://localhost:8000/mytest en un navegador, entonces "Obtenga una solicitud" se visualiza. Si realiza una solicitud PUT con un cliente de reposo (también para localhost: 8000/mytest), el contenido del cuerpo de la solicitud se almacena en "/tmp/restrq.txt".

Este código es parte del archivo Site.hs del complemento Marco:

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

No estoy seguro acerca de los servidores puros, pero para pequeños proyectos, que no necesitan un pleno derecho web framework, utilizo la biblioteca WAI, que también es utilizada por el framework Yesod.

De todos modos, incluso si su aplicación es simple, sugeriría un marco real, porque los frameworks web de Haskell generalmente no tratan sobre ser una gran biblioteca de elementos predefinidos, sino solo proporcionar un concepto limpio para aplicaciones web, ya sean simples libros de visitas o aplicaciones comunitarias completas habilitadas para AJAX.

9

Para un servidor que implementa una API JSON estoy usando scotty, que se basa en WAI + Warp. Es increíblemente fácil de usar, en particular si ya ha creado aplicaciones con Sinatra.

Cuestiones relacionadas