gpt4 book ai didi

clojure - 如何在 Clojure 中制作 Web 应用程序?

转载 作者:行者123 更新时间:2023-12-03 00:58:37 24 4
gpt4 key购买 nike

我认为对于绝大多数每天使用 Java 的程序员来说这是一个奇怪的问题。我不。我了解 Java 语言,因为我从事过 Java 项目,但不了解 Java 世界。我从未用 Java 从头开始​​制作过 Web 应用程序。如果我必须使用 Python、Ruby,我知道该去哪里(Django 或 Rails),但如果我想在 Clojure 中创建一个 Web 应用程序,不是因为我被迫生活在 Java 世界中,而是因为我喜欢这种语言,我想尝试一下,我应该使用哪些库和框架?

最佳答案

Compojure 不再是开发 Web 应用程序的完整框架。自 0.4 版本以来,compojure 已分解为多个项目。

Ring通过抽象 HTTP 请求和响应过程来提供基础。 Ring 将解析传入的请求并生成一个包含请求所有部分的映射,例如 uri、服务器名称和请求方法。然后应用程序将处理该请求并根据该请求生成响应。响应表示为包含以下键的映射:状态、 header 和正文。因此,一个简单的应用程序如下所示:

(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))

Ring 的另一部分是中间件的概念。这是位于处理程序和传入请求和/或传出响应之间的代码。一些内置中间件包括 session 和堆栈跟踪。 session 中间件将向请求映射添加一个 :session 键,其中包含发出请求的用户的所有 session 信息。如果 :session 键存在于响应映射中,它将被存储以供当前用户发出的下一个请求。而堆栈跟踪中间件将捕获处理请求时发生的任何异常,并生成堆栈跟踪,如果确实发生任何异常,该堆栈跟踪将作为响应发送回来。

直接使用 Ring 工作可能会很乏味,所以 Compojure构建在 Ring 之上,抽象了细节。现在,应用程序可以用路由来表示,因此您可以得到如下所示的内容:

(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))

Compojure 仍在使用请求/响应映射,因此您可以随时在需要时访问它们:

(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))

在本例中,{uri :uri} 部分访问请求映射中的 :uri 键并将 uri 设置为该值。

最后一个组件是 Hiccup这使得生成 html 变得更容易。各种 html 标签都表示为向量,第一个元素表示标签名称,其余元素表示标签正文。 "<h2>A header</h2>"变成[:h2 "A Header"] 。标签的属性位于可选映射中。 "<a href='/login'>Log In Page</a>"变成[:a {:href "/login"} "Log In Page"] 。这是一个使用模板生成 html 的小示例。

(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))

(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))

(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))

以下是 compojure 作者目前正在编写的一些文档的草稿链接,您可能会发现它有所帮助:Compojure Doc

关于clojure - 如何在 Clojure 中制作 Web 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/167262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com