我正在使用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
后,朋友以大字体抱怨无效的防伪标记(???)
答案 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-json的wrap-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 - 谢谢你的帮助!