Clojure: Web開發初體驗 - 基於 Ring

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 的路由處理,但願你們能喜歡!

相關文章
相關標籤/搜索