Compojure не получает тело запроса

У меня есть приложение, использующее Compojure с такой конечной точкой.

(defroutes routes
  (POST "/api/v1/echo" req (str req))

(def http-handler
  (reload/wrap-reload (wrap-defaults #'routes api-defaults)))

(defn run-web-server []
    (run-jetty http-handler {:port 10555 :join? false}))

Когда я пробую этот запрос на завивку

curl -X POST -H "Content-Type: application/json" http://localhost:10555/api/v1/echo -d '{"hello": "world"}'

я получаю этот ответ

{:ssl-client-cert nil, :remote-addr "0:0:0:0:0:0:0:1", :params {}, :route-params {}, :headers {"accept" "*/*", "user-agent" "curl/7.43.0", "content-type" "application/json", "content-length" "18", "host" "localhost:10555"}, :server-port 10555, :content-length 18, :form-params {}, :query-params {}, :content-type "application/json", :character-encoding nil, :uri "/api/v1/echo", :server-name "localhost", :query-string nil, :body #object[org.eclipse.jetty.server.HttpInput 0x4317e5fa "org.eclipse.jetty.server.HttpInput@4317e5fa"], :scheme :http, :request-method :post}%

Я ожидаю увидеть {"hello", "world"} где-то в этом ответе, но его там нет. Я вижу, что есть :body HttpInput, но когда я пробую (prn (-> req :body .read)), выводится 123. Потому что (= "{\"hello\", \"world\"}" 123) => false я немного не понимаю, что делать дальше.

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" http://localhost:10555/api/v1/echo -d "foo=1&bar=2" работает как положено и возвращает :params {:foo "1", :bar "2"}, но я бы предпочел отправить json. Я знаю, что мог бы использовать compojure-api, но мне любопытно, почему это так себя ведет.


person munk    schedule 19.02.2016    source источник


Ответы (2)


Вам необходимо использовать промежуточное ПО ring-json, в частности wrap-json-body для анализа параметров json:

Промежуточное ПО wrap-json-body будет анализировать тело любого запроса с типом содержимого JSON в структуру данных Clojure и назначать его ключу :body.

Это предпочтительный способ обработки запросов JSON.

person Diego Basch    schedule 19.02.2016

Попробуйте добавить промежуточное ПО wrap-json-params в свой обработчик.

person Taha Husain    schedule 19.02.2016