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

时间:2010-07-05 15:34:35

标签: rest web-services frameworks clojure

我正在研究轻量级的东西,至少应该支持以下功能:

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

我知道为这些选项中的每一个推出自己的微框架相对容易,但是如果像这样的东西已经存在,为什么重新发明轮子呢?特别是如果它是:

  • 活跃项目,贡献者/用户数量不断上升
  • 至少有在线基础文档和教程。

5 个答案:

答案 0 :(得分:54)

首先,我认为你不太可能在Clojure中找到一个单独的收缩包解决方案(除了通过互操作使用的Java库的形式)。什么成为Clojure的标准Web堆栈包含许多库,人们可以通过各种方式进行混合和匹配(因为它们很乐意完全兼容)。 1

以下是您可能会觉得有用的一些构建块的列表:

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

  2. Sandbar - 目前是一个身​​份验证库,计划了更多类型的功能;正在开发中。

  3. Compojure - 一个成熟而强大的库,它提供了一个很好的DSL,用于编写在Ring上使用的路由。这将为您提供良好的URL参数处理。

  4. Compojure-rest - “用于在Compojure之上构建RESTful应用程序的库”。据我所知,在早期发展阶段,构成休息;或许您可能会将此视为影响其设计的机会。 : - )

  5. 为了处理XML,有clojure.contrib.lazy-xml(以及帮助库clojure.contrib.zip-filter.xml)和Enlive(内置clojure.xml命名空间目前不是很有用);这些将被串联使用(虽然为了您的目的,前者可能就足够了)。

  6. 对于JSON,在contrib和clojure-json中有一个库(我认为至少还有一个其他的lib我现在似乎忘记了......);选择你最喜欢的那个。

  7. 所有人都会对REPL驱动的开发风格感到非常满意(请参阅this SO question的已接受答案,获取一个非常符合此目的的Ring技巧)。我想上面的链接集合确实留下了一些盲点(特别是,据我所知,身份验证故事仍在解决之中),但希望这是一个良好的开端。


    1 我知道的唯一用于在Clojure中构建Web应用程序的单包解决方案是Conjure,受Rails的启发;不幸的是,我不得不承认我对此并不了解,所以如果您有兴趣,请点击链接并查看来源,wiki& c。

答案 1 :(得分:7)

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

答案 2 :(得分:1)

如果您正在寻找一些示例,现实世界的说明性代码来帮助您入门,那么您可以研究这个clojure-news-feed on github项目,该项目演示了如何使用compojure / ring实现非平凡的RESTful Web服务通过JMX包装SQL(postgresql或mysql)和NoSQL(cassandra),搜索(solr),缓存(redis),事件记录(kafka),连接池(c3po)和实时指标。

这篇关于Building a Scalable News Feed Web Service in Clojure的博客提供了很好的介绍。我在一个不起眼的AWS部署上针对此服务运行了一些负载测试,每秒大约有80个事务处理,每个事务的平均延迟时间不到半秒。

答案 3 :(得分:0)

看看解放者库http://clojure-liberator.github.io/liberator/这不是一个独立的解决方案,非常适合休息服务定义。

答案 4 :(得分:0)

为了提供这个旧问题的最新答案,目前(在2018年),我认为Luminus提供了一个很好的起点。它使用了之前答案中提到的许多库(ring,compojure等),它们是模块化的,并且与Clojure一样接近“单一包”。特别是对于REST,请查看compojure-api。 Luminus建议buddy进行身份验证,我在传统的基于会话的身份验证以及Oauth和无状态JWT方面都取得了很好的成功。