如何区分Compojure / Ring中的html与xhr / xml / json请求?

时间:2012-03-11 18:56:37

标签: clojure compojure ring

如何在Compojure / Ring中区分html vs xhr / xml / json请求,类似于Rails中的respond_to?

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

3 个答案:

答案 0 :(得分: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?函数有点原始,但它可以作为起点。

答案 1 :(得分:2)

您需要使用可以处理Accept Header MIME类型的Ring中间件,并将响应映射数据值转换为适当的MIME。

退房:ring-middleware-format

答案 2 :(得分:1)

作为您参考提及的文档,

  

Rails从HTTP Accept确定所需的响应格式   客户提交的标题。

您的代码也可以查看Accept标头,并根据其内容决定发送内容,您可以通过索引到请求对象来获取内容。有趣的问题是,是否有一种简单的方法可以解析标题并将其拆分。

您可以在 Is there some Java library for Accept HTTP header parsing? 的答案中找到相关信息。