如何在Compojure / Ring中区分html vs xhr / xml / json请求,类似于Rails中的respond_to?
http://apidock.com/rails/ActionController/MimeResponds/respond_to
答案 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。
答案 2 :(得分:1)
作为您参考提及的文档,
Rails从HTTP Accept确定所需的响应格式 客户提交的标题。
您的代码也可以查看Accept
标头,并根据其内容决定发送内容,您可以通过索引到请求对象来获取内容。有趣的问题是,是否有一种简单的方法可以解析标题并将其拆分。
您可以在 Is there some Java library for Accept HTTP header parsing? 的答案中找到相关信息。