Как получить все параметры простой формы POST в compojure.api.sweet? - PullRequest
0 голосов
/ 14 апреля 2020

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

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

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

Итак: Как получить все представленные параметры тела без десериализации? Строка тела 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))

)))

Я пробовал несколько вещей, но пока ничего не получалось.

Я могу ' t скопировать методы из 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 middleware (и вместе с параметрами-переносами в обоих порядках) также ничего не делает.

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

...