在Clojure中开发RESTful Web服务有什么好的起点?

我正在寻找轻量级的东西,至less应该支持以下function:

  • 支持通过元数据轻松定义操作
  • 从请求提取参数到clojure映射的包装器,或作为函数参数
  • 支持多种forms的authentication(基本,表单,cookie)
  • 基于api方法元数据的基本授权
  • 包裹在clojure地图中的会话对象
  • REPL实时编码(无需重启服务器)
  • 将返回值自动序列化为json和xml
  • 有好的(可插入的)url参数处理(例如/ action / par1 / par2而不是/ action?par1 = val1&par2 = val2)

我知道为这些选项中的每一个select一个自己的微观框架是相对容易的,但是为什么要重新发明轮子? 特别是如果它是:

  • 活跃的项目,贡献者/用户数量不断增加
  • 至less有基本的文档和教程在线。

首先,我认为你不可能在Clojure中find一个简单的解包scheme(除了通过互操作使用Java库)。 什么是成为Clojure的标准Web栈包括一些人们以各种方式混合和匹配(因为他们愉快地倾向于完全兼容)的图书馆。 1

以下是您可能会觉得有用的一些积木的列表:

  1. Ring – Clojure的基本HTTP请求处理库; 所有其他的webby库(用于写路由&c。),我知道是与环兼容。 Ring正在积极开发,拥有一个强大的社区,写得非常好,并有一个很好的SPEC文档详细说明其devise理念。 这个博客文章提供了一个很好的例子,说明如何使用它(对GitHub提交做出反应)。

  2. Sandbar – 目前是一个authentication库,计划了更多types的function; 正在开发中。

  3. Compojure – 一个成熟和强大的库,它提供了一个很好的DSL,用于编写在Ring之上使用的路由。 这将给你很好的URL参数处理。

  4. Compojure-rest – “用于在Compojure之上构buildRESTful应用程序的库”。 据我所知,综合rest处于发展的早期阶段; 也许你可能会认为这是一个影响其devise的机会。 🙂

  5. 为了处理XML,有clojure.contrib.lazy-xml (和helper库clojure.contrib.zip-filter.xml )和Enlive (内置的clojure.xml名字空间目前不是很好用)。 这些将一起使用(尽pipe为了你的目的,前者可能就足够了)。

  6. 对于JSON,在contrib和clojure-json中有一个库(我至less还有一个库似乎现在已经忘记了)。 挑你最喜欢的一个。

对于REPL驱动的开发风格,所有这些都将会非常满意(请参阅这个SO问题的接受答案, 这是一个非常有用的环形技巧)。 我想上面的链接集合确实留下了一些盲点(特别是,据我所知,authentication故事还在被解决),但希望这是一个好的开始。


1我知道的唯一一个在Clojure中构buildwebapps的单一包解决scheme是受Rails启发的Conjure ; 不幸的是,我不得不承认,我对此不甚了解,所以如果你感兴趣的话,请点击链接,看看wiki和c。

当我build立我的第一个Clojurerest服务时,我发现自己经常问同样的问题。 Clojure工具箱帮了我很多: http : //www.clojure-toolbox.com/

如果您正在寻找一些真实世界的示例代码来帮助您开始,那么您可以在github项目上学习这个clojure-news-feed,它演示了如何使用compojure / ring实现一个不平凡的RESTful Web服务(postgresql或mysql)和NoSQL(cassandra),search(solr),caching(redis),事件日志logging(kafka),连接池(c3po)和通过JMX的实时指标。

这篇关于在Clojure中构build可伸缩新闻馈送Web服务的博客提供了一个很好的介绍。 我在一个不起眼的AWS部署上针对这个服务运行了一些负载testing,每秒处理了大约80个事务,每个事务平均延迟不到半秒。