2012-03-11 5 views

答えて

1

レールHTTPから所望の応答フォーマットはクライアントによって提出 ヘッダを受け入れ決定します。

あなたのコード、あまりにも、Acceptヘッダを見て、あなたがリクエストオブジェクトにインデックスを付けることで得ることができ、その内容に基づいて送信するかを決定することができます。面白いのは、ヘッダーを解析して分解する簡単な方法があるかどうかです。

Is there some Java library for Accept HTTP header parsing?への回答があります。

+0

質問は特にCompojure/Ringについて書かれています – Sathish

+0

@Sathish '(get-in request [:headers" accept "])'を実行して 'Accept'ヘッダを取得できます。' request'は渡されたリクエストオブジェクトですあなたのハンドラ。これは私が "要求オブジェクトにインデックスを付ける"ことを意味していました。 –

2

AcceptヘッダーMIMEタイプを処理し、応答マップデータ値を適切なMIMEに変換できるRingミドルウェアを使用する必要があります。

チェックアウト:ring-middleware-format

5

を明示的にAcceptヘッダに基づいて区別したくないと仮定 - と、単にあなたが以下のような独自のディスパッチ関数を作成することができ、はAnkurの答えに従って、適切な応答タイプを返しません。

(defn dispatch [m] 
    (let [req  (ring-request) 
     accept (get (:headers req) "accept") 
     accept? #(re-find (re-pattern (str "^" %)) accept) 
     key  (cond 
       (accept? "application/json") :json 
       (accept? "text/html")  :html 
       :else      :default)] 
    ((key m)))) 

、次いでこれ

(defpage "/foo" [] 
    (dispatch {:json (fn [] "{}") 
      :html (fn [] "html") 
      :default (fn [] "default")})) 

上記accept?機能は少し原始的であるが、それは出発点として働くことができるようにそれを呼び出します。

+0

'defpage'マクロはどこから来たのですか? CompojureまたはRingの一部ですか?私はノワールだけにいくつかの痕跡を発見した。 –

関連する問題