У меня есть маршрут, для которого я должен получить все параметры из тела. У меня нет выбора, потому что он будет вызываться из сторонней системы, поэтому мне приходится работать с простыми инструментами. У меня также нет полного контроля над передаваемыми данными, и мне все равно нужно все. Мне нужно каждое поле, но я не знаю, что это такое.
Одним из решений было бы выбрать все поля, которые могут быть отправлены, и использовать необязательные параметры, но это не идеально, потому что мне придется проверять это вручную для всех типов запросов.
И, как я понял, в моем запросе есть как минимум 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
. Но я установил тип контента для формы и добавил некоторые данные в тело.