请求在Ring / Compojure应用

时间:2015-07-20 15:34:50

标签: clojure compojure ring

我正在使用Ring和Compojure编写一个Web应用程序,并使用Friend库进行授权。最近我对项目进行了一些更改,现在我无法再获取请求参数了。

我过去常常这样做:

; Routes definition
(defroutes app-routes
  (POST "/*.do" request 
    (insert-data (:params request))))

; Middlewares
(def secured-routes
  (handler/site
    (-> app-routes
        wrap-params
        (friend/authenticate friend-params-map))))

和form / URL参数将被解析为Clojure映射。现在这似乎不起作用,(:params request)包含表格

的地图
{:* <request-url>}

使用一个:*密钥。如果我尝试(println request),那么获得一个包含大量键值对的Clojure地图,其中有

:body #object[org.eclipse.jetty.server.HttpInputOverHTTP 0x6ef9a9e1 HttpInputOverHTTP@6ef9a9e1]

似乎包含请求数据,对吗?但我如何获取这些?

以前我刚刚使用wrap-params中间件,如上所述,并且有效。

一种有效的方法是在每个处理程序中调用(body-string request),它将返回请求体的字符串化版本。但是为每个url处理程序获取一个自动解析的Clojure映射会很棒。显然,我错过了一些东西。

有人可以提供建议吗?我也很乐意找到更多如何自己调试这些类型的处理程序问题 - 意思是,调试中间件链并找出为什么wrap-params没有被调用或被调用不正确。

谢谢!

更新:根据@ nberger的评论,我尝试将secured-routes定义更改为:

(def secured-routes
  (-> app-routes
      (wrap-defaults site-defaults)
      (friend/authenticate friend-params-map)))

但现在登录页面根本不起作用(身份验证停止工作)。按照评论中的建议在wrap-defaults之后移动friend/authenticate后,朋友以大字体抱怨无效的防伪标记(???)

1 个答案:

答案 0 :(得分:2)

我发现了这个问题。在前端代码中,POST到* .do已被修改为发送application/json内容类型。下面是使用的jQuery的ajax调用:

$.ajax({ 
  url: '/saveInput.do',
  type: 'POST',
  contentType: 'application/json; charset=UTF-8',
  data: JSON.stringify(formValues),
});

我已将其修改为

$.ajax({ 
  url: '/saveInput.do',
  type: 'POST',
  data: formValues,
});

现在可以使用了。此外,通过包含来自ring-jsonwrap-json-params中间件,可以保留具有JSON内容类型的原始Ajax调用,以便最终路由定义变为:

(def secured-routes
  (-> app-routes
      (friend/authenticate friend-params-map)
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
      wrap-json-params))

我选择了后者。 @nberger - 谢谢你的帮助!