我有一条路线,我必须从正文中获取所有参数。我别无选择,因为它将从第三方系统调用,所以我必须使用简单的工具。我也无法完全控制传递的数据,无论如何我都需要。我需要每个领域,但我不知道那些是什么。
解决方案之一是挑选所有可以提交的字段并使用可选参数,但这并不理想,因为我必须手动测试所有请求类型。
我发现我的请求中至少有 30 个不同的提交字段需要连接起来以进行 HMAC 请求验证。你可以猜到我的处理程序是什么样子的……(提示:){Field :- s/Str ""}
我还有一个请求至少会这么大但不同。并且我计划在未来做更多的事情。钱币。
那么:如何在不进行任何反序列化的情况下获取所有提交的正文参数?HTTP Body 字符串、参数映射或 InputStream 是完全可以接受的解决方案。在这一点上,任何事情都比手动指定所有这些要好。(VIM 宏——感谢您的帮助)
我的代码:
(ns api.compojure-api
(:require [compojure.api.sweet :refer :all]
[schema.core :as s]
[ring.util.http-response :refer :all]
[ring.middleware.params]
[muuntaja.middleware]))
(def app
(api
(context "/something" []
(POST "/api/:variable" req
:middleware [;;ring.middleware.params/wrap-params ;; This does nothing
;;muuntaja.middleware/wrap-params ;; This does nothing
(fn [handler]
(fn
([request]
(println "request" request) ;; This prints the request but params are not there, they are not deserialized
(handler request))
([request respond raise]
(println "request" request)
(handler request respond raise))))]
;; :body-params [some-body-param :- s/Str] ;; This works if I know the fields. But I don't want to know or specify.
;; :coercion nil ;; stops coercing the output, but I need to not coerce the input into String or Object too.
(println (:params req)) ;; this prints only value from path (`:variable`), but not from body.
(ok))
)))
我尝试了多种方法,但到目前为止没有任何效果。
我无法从compojure
包装整个路由的示例中复制方法,因为compojure.api.sweet
它与 plain 不同compojure
。
版本:
[org.clojure/clojure "1.10.1"]
[metosin/compojure-api "1.1.13"]
[ring/ring-core "1.8.0"]
[metosin/muuntaja "0.6.6"]
[metosin/ring-http-response "0.9.1"]
所有这些解决方案都返回nil
:
如何使用 Compojure 获取 POST 请求的所有参数
muuntaja.middleware/wrap-format
中间件(以及两个订单中的 wrap-params )也不做任何事情。
我也尝试打印(slurp (:body req))
,ring.util.request/body-string
但它是空的。实际上这是输出(println (:body req))
:
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x12335807 HttpInputOverHTTP@12335807[c=0,q=0,[0]=null,s=EOF]]
其中说那个参数s=EOF
。但我已将内容类型设置为 form 并在正文中添加了一些数据。