如何区分 Compojure/Ring 中的 html 与 xhr/xml/json 请求,类似于 Rails 中的 respond_to?
http://apidock.com/rails/ActionController/MimeResponds/respond_to
如何区分 Compojure/Ring 中的 html 与 xhr/xml/json 请求,类似于 Rails 中的 respond_to?
http://apidock.com/rails/ActionController/MimeResponds/respond_to
假设您确实想根据 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?
函数有点原始,但它可以作为一个起点。
您将需要使用可以处理 Accept Header MIME 类型并将响应映射数据值转换为适当的 MIME 的 Ring 中间件。
签出:环中间件格式
正如您引用的文档所述,
Rails 根据客户端提交的 HTTP Accept 标头确定所需的响应格式。
您的代码也可以查看Accept
标头并根据其内容决定要发送的内容,您可以通过对请求对象进行索引来获得这些内容。有趣的问题是是否有一种简单的方法来解析标题并将其分开。
您可能会在Is there some Java library for Accept HTTP header parsing的答案中找到一些相关信息?.