2

Railsのrespond_toと同様に、Compojure /Ringでhtmlとxhr/xml / jsonのリクエストを区別する方法は?

http://apidock.com/rails/ActionController/MimeResponds/respond_to

4

3 に答える 3

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?関数は少し原始的ですが、出発点として役立つかもしれません。

于 2012-04-21T10:57:44.310 に答える
2

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

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

于 2012-03-12T04:44:35.997 に答える
1

あなたが参照するドキュメントが言及しているように、

Rails は、クライアントから送信された HTTP Accept ヘッダーから目的の応答形式を決定します。

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

これに関する情報は、 Is there some Java library for Accept HTTP header parsing?への回答で見つけることができます。.

于 2012-03-11T20:25:51.497 に答える