una - verbos http rest
¿Cuál es el buen punto de partida para desarrollar un servicio web RESTful en Clojure? (5)
Eche un vistazo a la biblioteca liberadora http://clojure-liberator.github.io/liberator/ No es una solución independiente, compre muy bien para la definición del servicio de descanso.
Estoy buscando algo ligero, que, como mínimo, debe admitir las siguientes características:
- Soporte para definición fácil de acciones a través de metadatos
- Wrapper que extrae los parámetros de la solicitud en el mapa clojure, o como parámetros de función
- Soporte para múltiples formas de autenticación (básica, forma, cookie)
- autorización básica basada en los metadatos del método api
- objeto de sesión envuelto en el mapa de clojure
- Codificación en vivo desde REPL (no es necesario reiniciar el servidor)
- serialización automática del valor de retorno a json y xml
- tener un manejo de parámetros de URL agradable (enchufable) (por ejemplo / acción / par1 / par2 en lugar de / acción? par1 = val1 y par2 = val2)
Sé que es relativamente fácil rodar mi propio micro-framework para cada una de estas opciones, pero ¿por qué reinventar la rueda si algo así ya existe? Especialmente si es:
- Proyecto activo con un número creciente de contribuyentes / usuarios
- Tener al menos documentación básica y tutorial en línea.
En primer lugar, creo que es poco probable que encuentre una sola solución envuelta para hacer todo esto en Clojure (excepto en la forma de una biblioteca Java que se utilizará a través de interoperabilidad). Lo que se está convirtiendo en la pila web estándar de Clojure comprende una serie de bibliotecas que las personas mezclan y combinan en todo tipo de formas (ya que felizmente tienden a ser perfectamente compatibles). 1
Aquí hay una lista de algunos bloques de construcción que pueden serle útiles:
Ring : la biblioteca de manejo de solicitudes HTTP básica de Clojure; todas las otras bibliotecas webby (para escribir rutas & c.) que yo sepa son compatibles con Ring. Ring está siendo desarrollado activamente, tiene una comunidad robusta, está muy bien escrito y tiene un buen documento de SPEC que detalla su filosofía de diseño. Esta publicación de blog proporciona un buen ejemplo de cómo podría usarse (reaccionando a las confirmaciones de GitHub).
Sandbar : actualmente una biblioteca de autenticación, más tipos de funcionalidad planificada; en desarrollo.
Compojure : una biblioteca madura y robusta que proporciona un buen DSL para escribir rutas que se utilizarán sobre Ring. Esto le dará un buen manejo de parámetros de URL.
Compojure-rest - "una biblioteca para construir aplicaciones RESTful sobre Compojure ". Compojure-rest es, hasta donde puedo decir, en sus primeras etapas de desarrollo; quizás pueda ver esto como una oportunidad para influir en su diseño. :-)
Para tratar con XML, hay
clojure.contrib.lazy-xml
(y la biblioteca de ayudaclojure.contrib.zip-filter.xml
) y Enlive (el espacio de nombresclojure.xml
actualmente no es muy útil); estos se usarían en tándem (aunque para sus propósitos, el primero podría ser suficiente).Para JSON, hay una biblioteca en contrib y clojure-json (y creo que había al menos otra lib que ahora me olvido ...); elige el que más te guste.
Todos estarán perfectamente contentos con un estilo de desarrollo impulsado por REPL (ver la respuesta aceptada a esta pregunta SO para un truco de Ring que es muy útil aquí). Supongo que la colección de enlaces anterior deja algunos puntos ciegos (en particular, la historia de autenticación todavía está siendo resuelta, por lo que yo sé), pero espero que sea un buen comienzo.
1 La única solución de paquete único para crear webapps en Clojure que conozco es Conjure , inspirada en Rails; desafortunadamente tengo que admitir que no sé mucho al respecto, así que si te interesa, sigue el enlace y echa un vistazo a las fuentes, wiki & c.
Mientras construía mi primer servicio de descanso Clojure, me encontré a mí mismo haciendo a menudo la misma pregunta. Clojure Toolbox me ayudó mucho: http://www.clojure-toolbox.com/
Si está buscando una muestra, un código ilustrativo del mundo real para comenzar, entonces podría estudiar este clojure-news-feed en el proyecto github que demuestra cómo implementar un servicio web RESTful no trivial con compojure / ring that wraps tanto SQL (postgresql o mysql) como NoSQL (cassandra), búsqueda (solr), almacenamiento en caché (redis), registro de eventos (kafka), agrupación de conexiones (c3po) y métricas en tiempo real a través de JMX.
Este blog sobre la creación de un servicio web de alimentación de noticias escalables en Clojure proporciona una buena introducción. Ejecuté algunas pruebas de carga contra este servicio en una implementación humilde de AWS y obtuve alrededor de ochenta transacciones por segundo con una latencia promedio de menos de medio segundo por transacción.
Solo para proporcionar una respuesta actualizada a esta vieja pregunta, actualmente (en 2018) creo que Luminus proporciona un excelente punto de partida. Está utilizando muchas de las bibliotecas (anillo, compojure, etc.) mencionadas en respuestas anteriores, es modular y lo más parecido al "paquete único" que se puede obtener con Clojure. Específicamente para REST, eche un vistazo a compojure-api . Luminus recomienda buddy para la autenticación, he tenido un buen éxito al usarlo tanto para la autenticación tradicional basada en sesiones como para los JWT Oauth y sin estado.