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

在Clojure中开发RESTful web服务的良好起点是什么?,rest,web-services,frameworks,clojure,Rest,Web Services,Frameworks,Clojure,我正在研究一种轻量级产品,它至少应该支持以下功能: 支持通过元数据轻松定义操作 将请求中的参数提取到clojure映射或作为函数参数的包装器 支持多种形式的身份验证(基本、表单、cookie) 基于api方法元数据的基本授权 clojure映射中包装的会话对象 来自REPL的实时编码(无需重新启动服务器) 将返回值自动序列化为json和xml 具有良好的(可插入的)url参数处理(例如/action/par1/par2而不是/action?par1=val1&par2=val2) 我知道,为

我正在研究一种轻量级产品,它至少应该支持以下功能:

  • 支持通过元数据轻松定义操作
  • 将请求中的参数提取到clojure映射或作为函数参数的包装器
  • 支持多种形式的身份验证(基本、表单、cookie)
  • 基于api方法元数据的基本授权
  • clojure映射中包装的会话对象
  • 来自REPL的实时编码(无需重新启动服务器)
  • 将返回值自动序列化为json和xml
  • 具有良好的(可插入的)url参数处理(例如/action/par1/par2而不是/action?par1=val1&par2=val2)
我知道,为每一个选项推出自己的微框架相对容易,但如果已经存在类似的东西,为什么还要重新发明轮子呢?尤其是在以下情况下:

  • 参与者/用户数量不断增加的活动项目
  • 至少有基本的在线文档和教程

首先,我认为您不太可能在Clojure中找到一个单独的收缩包装解决方案来完成所有这一切(除非以Java库的形式通过interop使用)。Clojure的标准Web堆栈由许多库组成,人们可以通过各种方式混合和匹配这些库(因为它们往往是完全兼容的)。1

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

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

  • --目前是一个认证库,规划了更多类型的功能;正在开发中

  • --一个成熟而健壮的库,它提供了一个很好的DSL,用于编写环上使用的路由。这将为您提供良好的URL参数处理

  • --“一个用于在上构建RESTful应用程序的库”。据我所知,Compojure rest正处于开发的早期阶段;也许您会将此视为影响其设计的机会。:-)

  • 对于处理XML,有
    clojure.contrib.lazy XML
    (以及帮助程序库
    clojure.contrib.zip filter.XML
    )和(内置的
    clojure.XML
    命名空间目前不是很有用);这些将被串联使用(尽管出于您的目的,前者可能就足够了)

  • 对于JSON,contrib中有一个库(我想至少还有一个库我现在似乎忘记了…);挑一个你最喜欢的

  • 所有人都会对REPL驱动的开发风格非常满意(请参阅公认的答案,以了解一个非常符合本文目的的技巧)。我想上面的链接集合确实留下了一些盲点(特别是,据我所知,身份验证的故事仍在整理中),但希望这是一个好的开始



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

    在构建我的第一个Clojure rest服务时,我发现自己经常问同样的问题。Clojure工具箱帮了我很多忙:

    如果您正在寻找一些示例性的、真实的、说明性的代码来帮助您入门,那么您可以研究这个项目,该项目演示了如何使用compojure/ring实现一个非平凡的RESTful web服务,它封装了SQL(postgresql或mysql)和NoSQL(cassandra)、搜索(solr)、缓存(redis)事件日志(kafka)、连接池(c3po)和通过JMX的实时度量


    这个博客提供了一个很好的介绍。我在一个不起眼的AWS部署上对该服务运行了一些负载测试,每秒得到大约80个事务,每个事务的平均延迟不到半秒。

    看看liberator库,它不是一个独立的解决方案,购买非常好的rest服务定义。

    仅为这个老问题提供一个更新的答案,我认为目前(2018年)提供了一个极好的起点。它使用了前面答案中提到的许多库(ring、compojure等),是模块化的,并且尽可能接近Clojure的“单个包”。特别是对于休息,请看一看。Luminus推荐使用身份验证,我已经成功地将其用于传统的基于会话的身份验证以及Oauth和无状态JWT。

    谢谢您的回答。这正是我想要的,我宣布这个答案:太棒了。谢谢在这个项目中查看它可能也会有所帮助,它是一个实验性的、有良好文档记录的webshop REST api。它具有您列出的一些功能。