Ring 的目標是把 HTTP 的細節抽象爲簡單且模塊化的 API,它與 Python 的 WSGI 和 Ruby 的 Rake 很是相似。能夠用來構建類型普遍的應用。html
新建基於 default 模板的項目:java
$ lein new hello
修改 hello/project.clj 文件,添加依賴和入口配置,以下:web
(defproject hello "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.8.0"] [ring/ring-devel "1.4.0"] [ring/ring-core "1.4.0"] [http-kit "2.1.19"]] :main hello.core/-main)
執行 lein deps 下載依賴。
shell
開發服務器採用 http-kit ,這是一個異步高性能 web 服務器,志在取締 jetty。咱們須要向 http-kit 註冊一個 handler。當咱們請求 http-kit 服務器時,http-kit 會調用事先註冊好的 handler 。handler 必須返回一個 response map。格式以下:服務器
{:status 200 :header {"Content-Type" "text/html"} :body "hello world"}
其中 :status 爲狀態碼,:header 爲響應頭部,:body 爲響應數據。websocket
http-kit 提供了極爲簡單易用的函數調用來啓動一個服務:eclipse
(run-server handler & [request-map])
一個簡單的例子:curl
(ns hello.core (:use [org.httpkit.server :only [run-server]])) (defn handler [request] {:status 200 :header {"Content-Type" "text/html"} :body "hello world\n"}) (defn -main [& args] (run-server handler {:port 5000}) (println "Start Http-Kit Server On Port 5000..."))
在命令行執行:異步
$ lein run Start Http-Kit Server On Port 5000...
訪問:socket
$ curl http://localhost:5000 hello world
http-kit 的 run-server 方法接受2個參數。第一個參數是註冊的 handler,而且這個 handler 必須是一元參數函數(參數爲請求對象),第二個參數爲選項,用於對 http-kit 進行設置。解釋以下:
Options: :ip ; 指定監聽的IP地址(默認爲:0.0.0.0) :port ; 指定監聽的端口(默認爲:8090) :thread ; HTTP工做線程數量(默認爲:4) :queue-size ; 最大隊列大小(默認爲:20KB) :max-body ; 最大HTTP包體大小(默認爲:8MB) :max-ws ; 最大websocket消息大小(默認爲:4MB) :max-line ; HTTP url的最大長度(默認爲:4KB) :proxy-protocol ; 禁用或啓用代理協議(默認爲::disable) :worker-name-prefix ; 工做線程名稱前綴(默認爲:worker-)
Ring 還自帶了 reponse 來進行響應,避免咱們手工構造 response map。修改 handler 代碼,以下:
(ns hello.core (:use [org.httpkit.server :only [run-server]] [ring.util.response :only [response]])) (defn handler [request] (response "hello world\n")) (defn -main [& args] (run-server handler {:port 5000}) (println "Start Http-Kit Server On Port 5000..."))
Ring 是基礎構件,http-kit 自始至終只是調用 handler。咱們來嘗試幾回請求:
$ curl http://localhost:5000 hello world $ curl http://localhost:5000/a/b/c hello world
聰明的你必定想獲得,若是在 handler 裏進行路由分發會怎麼樣呢?compojure 就是來幹這個事的。本文只是稍稍帶你們領略 Clojure 的 web 開發之美,下次再給你們帶來 Ring 中間件和 compojure 的路由處理,但願你們能喜歡!