【问题标题】:What is the good starting point to developing RESTful web service in Clojure?在 Clojure 中开发 RESTful Web 服务的良好起点是什么?
【发布时间】:2011-03-11 23:25:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 查看这个项目也可能会有所帮助,它是一个实验性的、有据可查的 webshop REST api。它具有您列出的一些功能。 github.com/i-schuetz/clojushop

标签: rest web-services frameworks clojure


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    只是为这个老问题提供更新的答案,目前(2018 年)我认为Luminus 提供了一个很好的起点。它使用了之前答案中提到的许多库(ring、compojure 等),是模块化的,并且与 Clojure 一样接近“单一包”。专门针对 REST,请查看 compojure-api。 Luminus 推荐 buddy 进行身份验证,我已经成功地将它用于传统的基于会话的身份验证以及 Oauth 和无状态 JWT。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          这里列出了一些您可能会觉得有用的构建块:

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

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

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

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

          5. 1234563这些将被串联使用(尽管出于您的目的,前者可能就足够了)。
          6. 对于 JSON,contrib 和 clojure-json 中有一个库(我认为至少还有一个其他库我现在似乎忘记了......);选择你最喜欢的。

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


          1我所知道的在 Clojure 中构建 webapps 的唯一单包解决方案是 Conjure,受 Rails 启发;不幸的是,我不得不承认我对此知之甚少,因此,如果您有兴趣,请点击链接并查看资源、wiki 等。

          【讨论】:

          • 感谢您的回答。这正是我想要的
          • 我宣布这个答案:太棒了。谢谢!
          猜你喜欢
          • 2023-04-06
          • 2012-01-19
          • 1970-01-01
          • 2011-11-23
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 2023-03-19
          • 1970-01-01
          相关资源
          最近更新 更多