Clojure Web 开发从零开始 之二 简单web 应用

上一篇文章里,我们已经建立了一个基本Clojure 程序,并且编译成了可执行的Jar 包,没看的,可以点这里Clojure Web 开发从零开始 之一.

在这篇文章中,我们要把这个Clojure 应用程序变成一个HTTP 服务器。

1 添加Clojure 库 http-kit

在project.clj 文件dependencies 里面加上:

[http-kit "2.3.0"]

project.clj 文件会变成下面这样:

(defproject clj-httpbin "0.1.0"
  :description "Clojure httpbin clone"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :main clj-httpbin.core
  :dependencies [[org.clojure/clojure "1.10.1"]
                 [http-kit "2.3.0"]])

2 下载http-kit 库

$ lein deps  ; 自动下载所有库

下载的库文件在~/.m2/repository 目录可以找到。你看的没错,这也是Maven local repository 的目录。

如果你想知道这个程序依赖的所有库可以用下面的命令:

$ lein deps :tree

3 最简单的web app

首先定义一个函数app,这个函数接受一个变量req,req 包含客户端发过来的HTTP 请求的内容。app 函数的返回值会作为HTTP 回复的内容。

(defn app [req]  ; 定义一个函数名叫app,这个函数接受一个变量req,然后返回一个map。
  {:status 200  ; HTTP Response status code
   :headers {"Content-Type" "text/html"}  ; HTTP Response Header Content-Type
   :body "Hello HTTP!"})  ; HTTP Response Body
(http/run-server app {:port 8080}) ; 启动HTTP Server,端口8080,
                                   ; httpkit 将接收到HTTP 请求会作为参
                                   ; 数传给函数app,函数app 的返回值会
                                   ; 作为HTTP Response 返回给客户端。

完整的core.clj 文件:

(ns clj-httpbin.core
  (:require [org.httpkit.server :as http])  ; 使用别名http 来导入 library org.httpkit.server
  (:gen-class))

(defn app [req]  ; 定义一个函数名叫app,这个函数接受一个变量req,然后返回一个map。
  {:status 200
   :headers {"Content-Type" "text/html"}
   :body "Hello HTTP!"})

(defn -main []
  (println "Hello, World!")
  (http/run-server app {:port 8080})
  (println "Server started on port 8080 ..."))

4 运行程序

$ lein run

应用程序会在端口8080 启动HTTP 服务。

curl -i http://localhost:8080
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 11
Server: http-kit
Date: Wed, 24 Jul 2019 23:55:08 GMT

Hello HTTP!

© 2015-2020 tendant