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

42

我正在寻找一个轻量级的框架,至少应该支持以下功能:

  • 通过元数据方便定义动作
  • 将请求参数提取为Clojure Map或函数参数的包装器
  • 支持多种身份验证方式(基本身份验证、表单身份验证和cookie身份验证)
  • 基于api方法元数据的基本授权
  • 用Clojure Map包装的会话对象
  • 从REPL实时编码(无需重新启动服务器)
  • 自动将返回值序列化为JSON和XML
  • 具有良好的(可插拔的)URL参数处理功能(例如/action/par1/par2而不是/action?par1=val1&par2=val2)

我知道为每个选项编写自己的微框架相对容易,但如果像这样的东西已经存在,何必重复造轮子呢?特别是它:

  • 活跃的项目,拥有日益增长的贡献者/用户数量
  • 至少有基本文档和在线教程。

查看这个项目可能也会有所帮助,它是一个实验性的、文档完备的网店 REST API。它具有你列出的一些功能。https://github.com/i-schuetz/clojushop - User
5个回答

54

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

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

  1. Ring -- Clojure的基本HTTP请求处理库;我所知道的所有其他编写路由等网络库都与Ring兼容。 Ring正在积极开发中,拥有强大的社区,编写非常好,并且具有详细说明其设计哲学的SPEC文档。 这篇博客文章提供了一个很好的例子,说明如何使用它(响应GitHub提交)。

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

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

  4. Compojure-rest -- "用于构建基于Compojure的RESTful应用程序的库"。据我所知,Compojure-rest仍处于早期开发阶段;也许您可以将其视为影响其设计的机会。 :-)

  • 处理XML的工具有 clojure.contrib.lazy-xml(和辅助库clojure.contrib.zip-filter.xml)以及Enlive(内置的clojure.xml命名空间目前不太实用);这些工具可以一起使用(但对于你的目的,前者可能已足够)。

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

  • 所有这些工具都能很好地支持REPL驱动的开发风格(请参阅此SO问题的被接受的答案,其中介绍了一种非常适合此处目的的Ring技巧)。我想上述链接集合确实存在一些盲点(特别是身份验证方面仍在完善,据我所知),但希望它是一个很好的开始。


    1我所知道的唯一一种用Clojure构建Web应用程序的单一包解决方案是Conjure,受Rails启发;不幸的是,我必须承认我对它了解不多,因此如果你感兴趣,请跟随链接并查看源代码、wiki等。


    我宣布这个答案:棒极了。谢谢! - jdl

    7

    1
    如果你正在寻找一些示例、实际、说明性代码来帮助你入门,那么你可以研究这个在github上的clojure-news-feed项目。该项目演示了如何使用compojure/ring实现一个非平凡的RESTful web服务,它包装了SQL(postgresql或mysql)和NoSQL(cassandra)、搜索(solr)、缓存(redis)、事件记录(kafka)、连接池(c3po),以及通过JMX实时度量。
    这篇关于在Clojure中构建可伸缩的News Feed Web Service的博客提供了一个很好的介绍。我在一个简单的AWS部署上对这个服务进行了一些负载测试,每个事务的平均延迟不到半秒,每秒约80个交易。

    0

    0

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接