gpt4 book ai didi

clojure - 请求参数未在 Ring/Compojure 应用程序中解析

转载 作者:行者123 更新时间:2023-12-01 03:40:08 25 4
gpt4 key购买 nike

我正在使用 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))))

并且表单/URL 参数将被解析为 Clojure 映射。现在这似乎不起作用,而且 (:params request)包含表格的 map
{:* <request-url>}

带单 :* key 。如果我尝试 (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正如评论中所建议的, friend 用大字体提示无效的防伪 token (???)

最佳答案

我找到了问题所在。前端代码中,POST s to *.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,
});

现在可以使用了。此外,可以通过包含 wrap-json-params 来保留具有 JSON 内容类型的原始 Ajax 调用。来自 ring-json 的中间件,所以路由定义最终变成:
(def secured-routes
(-> app-routes
(friend/authenticate friend-params-map)
(wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
wrap-json-params))

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

关于clojure - 请求参数未在 Ring/Compojure 应用程序中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com