使用Lisp创建 Web Service

18

我很好奇是否可以使用Lisp作为现代RESTful Web服务的基础,但由于其众多变体和实现,很难知道从何开始。

我相信有人在使用Lisp进行Web相关应用(只需浏览SO中的问题即可看到),但我想知道的是是否有适用于Web服务的特定Lisp实现? (例如本地Unicode支持,内置的Web相关库,性能等)

我不想寻找Unicode“黑科技”或Web框架。 我主要感兴趣的是开箱即用的功能。 我尚未选择任何Lisp衍生品或实现,尽管我在本科计算机科学课程中使用过CLISP中的Common Lisp(作为通用多项式计算器)。 特别是那些实际上以这种方式使用Lisp的人,如果有特别好的选择,则知道这个问题会很好。

2个回答

13

Racket 的标准库包含一个Web 服务器库。我尝试过它,但感觉它不适合我偏好的交互式 Lisp 工作方式。它确实具有一些很好的特性,如基于continuation的控制流,所以值得一看。

从个人经验来说,Common Lisp 是 Web 开发的绝佳选择。我的博客就是用它实现的。Hunchentoot 简单而强大,非常符合 Lisp 风格。支持交互式编程,而且还有像 Websockets 这样的插件(虽然我还没用过)。

话虽如此,在Clojure中进行 Web 编程同样令人愉快。我使用 Clojure 和 Noir 实现了一个面向家庭的 Web 社区中心。风格上,Noir 很类似于 Hunchentoot 和 cl-who 的结合。作为一个额外的好处,访问 Java 库非常有用(在我的情况下,实现 OpenID 登录支持在 Common Lisp 中可能很困难,在 Clojure 中却很容易)。因此,如果您的应用程序需要与第三方 Web 服务或数据格式交互,我建议仔细研究 Clojure。

在 Hunchentoot/Noir 风格的 Web 框架中,REST 接口也很容易实现。就这方面而言,我不能评价 Racket 的 Web 服务器,因为我对它不够熟悉。


我已经快速浏览了Hunchentoot,但它似乎只支持有限的动词,这是正确的吗?(GET和POST)- 我需要比那更灵活的东西。在Web服务中,访问原始的HTTP请求和响应头非常重要。Clojure/Noir似乎提供了这样的访问权限。我认为Racket也可以访问原始头文件,但需要更多时间来评估Racket的性质。也许一些Racket的支持者会留下一些评论。 - Matt Esch
2
@MattEsch 使用Hunchentoot,您可以使用request-method*函数访问请求方法。即使是define-easy-handler也不太关心动词 - 如果您想要进行CASTMAGIC请求,它也会起作用。 :) (尝试编写一个简单的处理程序,仅返回(symbol-name (hunchentoot:request-method*))。)在Noir中,调度机制直接支持标准HTTP动词(GETPOSTPUTDELETEHEAD)。 Hunchentoot和Noir都允许您访问HTTP请求标头。 - Matthias Benkard
感谢澄清。我只是对文档中为什么要强调特定的GET和POST动词感到困惑(好像这是一种新奇的东西)。感谢您的解释。我将尝试使用Hunchentoot并看看我能做出什么。我现在会保持问题开放,以便查看是否有其他回复。 - Matt Esch

6
我知道一个也许适合您的需要:Clack
Clack是一种基于Common Lisp的Web应用程序环境,受到Python的WSGI和Ruby的Rack的启发。
希望这能帮助到您。

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