2014-02-17 36 views
4

我想通過實現一個簡單的Web應用程序開始使用Clojure和Clojurescript。事情會相當不錯,到目前爲止,並從不同的教程,我想出了下面的代碼讀取:如何在Ring-Compojure應用程序上設置Content-Type標題

core.clj:

(ns myapp.core 
(:require [compojure.core :as compojure] 
      [compojure.handler :as handler] 
      [compojure.route :as route] 
      [myapp.controller :as controller])) 

(compojure/defroutes app-routes 
    (compojure/GET "/" [] controller/index) 
    (route/resources "/public") 
    (route/not-found "Not Found")) 

(def app 
    (handler/site app-routes)) 

controller.clj:

(ns myapp.controller 
    (:use ring.util.response) 
    (:require [myapp.models :as model] 
      [myapp.templates :as template])) 

(defn index 
    "Index page handler" 
    [req] 
    (->> (template/home-page (model/get-things)) response)) 

模板。 CLJ:

(ns myapp.templates 
    (:use net.cgrand.enlive-html) 
    (:require [myapp.models :as model])) 


(deftemplate home-page "index.html" [things] 
    [:li] (clone-for [thing things] (do-> 
            (set-attr 'data-id (:id thing)) 
            (content (:name thing))))) 

問題是我無法在這個網頁上顯示非ASCII字符,我不知道該怎麼在頁面上設置HTTP標頭。

我看到這樣的解決方案,但我根本無法揣摩出它們放在我的代碼:

(defn app [request] 
    {:status 200 
    :headers {"Content-Type" "text/plain"} 
    :body "Hello World"}) 

P.S:關於風格和/或代碼組織的任何建議,歡迎。

回答

10

使用ring.util.response

(require '[ring.util.response :as r]) 

然後在您的index功能:

(defn index 
    "Index page handler" 
    [req] 
    (-> (r/response (->> (template/home-page (model/get-things)) response)) 
     (r/header "Content-Type" "text/html; charset=utf-8"))) 

你可以在響應鏈中的其他動作,例如設置Cookie和諸如此類的東西:

(defn index 
    "Index page handler" 
    [req] 
    (-> (r/response (->> (template/home-page (model/get-things)) response)) 
     (r/header "Content-Type" "text/html; charset=utf-8") 
     (r/set-cookie "your-cookie-name" 
        "" {:max-age 1 
         :path "/"}))) 
+0

謝謝爲你的答案。這有效,但有一個小小的更正:我必須在r /響應後刪除雙箭頭宏。 – slhsen

相關問題