2

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

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 中间件。

签出:环中间件格式

于 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 回答