1

我有一条路线,我必须从正文中获取所有参数。我别无选择,因为它将从第三方系统调用,所以我必须使用简单的工具。我也无法完全控制传递的数据,无论如何我都需要。我需要每个领域,但我不知道那些是什么。

解决方案之一是挑选所有可以提交的字段并使用可选参数,但这并不理想,因为我必须手动测试所有请求类型。

我发现我的请求中至少有 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 并在正文中添加了一些数据。

4

0 回答 0