上一篇文章里,我们已经建立了一个基本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!