Как получить все параметры простой формы POST в compojure.api.sweet?

У меня есть маршрут, для которого я должен получить все параметры из тела. У меня нет выбора, потому что он будет вызываться из сторонней системы, поэтому мне приходится работать с простыми инструментами. У меня также нет полного контроля над передаваемыми данными, и мне все равно нужно все. Мне нужно каждое поле, но я не знаю, что это такое.

Одним из решений было бы выбрать все поля, которые могут быть отправлены, и использовать необязательные параметры, но это не идеально, потому что мне придется проверять это вручную для всех типов запросов.

И, как я понял, в моем запросе есть как минимум 30 различных отправленных полей, которые необходимо объединить для проверки запроса HMAC. Вы можете догадаться, как выглядит мой обработчик... (Подсказка: {Field :- s/Str ""}) И у меня есть еще один запрос, который будет как минимум таким же большим, но другим. И я планирую больше в будущем. Уф.

Итак: как мне получить все отправленные параметры тела без какой-либо десериализации? Строка тела HTTP, карта параметров или 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 отличается от обычного 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: Как чтобы получить все параметры запроса POST с помощью Compojure

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. Но я установил тип контента для формы и добавил некоторые данные в тело.


person vvwccgz4lh    schedule 14.04.2020    source источник