2011-07-12 30 views
11

Antes que nada soy nuevo en Haskell, pero debo decir que me enamoré del idioma desde que empecé a jugar con él. He hecho extensas C, Java, python y perl. Haskell definitivamente está creciendo en mí. Hace un tiempo escribí una aplicación web/servicios en perl/python para uno de mis proyectos personales. Me preguntaba si podría pasarlo a haskell como un proyecto divertido y hacer hackels de Haskell para ver cómo evoluciona.Marcos de servicios web en haskell

Sé que hay algunos frameworks sobresalientes para aplicaciones web en haskell. Lo que me gustaría hacer es tener un servicio escrito en haskell que responda con datos en diferentes formatos (SOAP, REST-xml, REST-json). Usaría javascript para compilar DOM, etc. Entonces mi pregunta es si hay alguna biblioteca que pueda usar para convertir el formato de los datos sobre la marcha ya. O dado el escenario, ¿cómo harías en Haskell?

No he jugado con este proyecto desde 2008, y mi idea inicial fue utilizar apacheCXF de la comunidad java y codificarlo todo en java. Pero me encantaría hacerlo en Haskell. ¿Algún consejo por favor?

+0

Ver http: // stackoverflow.com/questions/5645168/comparing-haskells-snap-and-yesod-web-frameworks –

Respuesta

8

He escrito algo similar usando Happstack.

Lo que hice fue crear un tipo para representar todas las respuestas posibles de mi aplicación web.

data AppResponse = Foo String Int | Bar [String] | etc 

entonces por escrito mis manejadores de valores de este tipo de retorno:

home :: ServerPart AppResponse 
user :: UserId -> ServerPart AppResponse 

etc,

Entonces escribió funciones que harían que la respuesta en diferentes formatos:

jsonResponse :: AppResponse -> JSON 
xmlResponse :: AppResponse -> XML 

etc.

Luego hay un filtro simple que mira el encabezado Accept y decide cuál de esas funciones de conversión usar.

Este enfoque es bueno porque:

  1. mayor parte del código no tiene que saber nada acerca del formato de respuesta (XML, JSON, etc)
  2. para añadir un nuevo formato que acaba de escribir nueva función como, newFormatResponse :: AppResponse -> NewFormat. El tipo AppResponse detalla todas las respuestas posibles, por lo que no tiene que buscar todo el código para averiguar qué respuestas son posibles.
6

Hay un haskellwiki page dedicado a este tema. Entre estos HappStack y Yesod son los más maduros. Para un principiante recomendaría HappStack ya que Yesod usa un poco de magia QuasiQuotes.

HappStack solo tiene algo mágico en su módulo de estado. Por lo que he escuchado, esto se modificará en HappStack 7, donde se cambiará para usar la tienda MACID, que es mucho menos mágica y tiene menos repetición.

Si quieres algo sencillo, deberías echarle un vistazo al Snap framework.

+6

Tenga en cuenta que la mayor parte de la magia de Yesod es: 1) Opcional 2) Uso seguro sin preocuparse por cómo funciona 3) Muy conveniente. Es una cuestión de gusto más que cualquier otra cosa. –

+1

@camccan Estoy de acuerdo con usted; no hay nada malo con la magia de Yesod. Pensé que podría ser un problema para un principiante manejar Haskell y una extensión de su sintaxis. Puede que ese no sea el caso, y podría ser mi preferencia ante Haskell vainilla. – HaskellElephant