Clojure Compojure未获取请求正文

Clojure Compojure未获取请求正文,clojure,compojure,Clojure,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})) 当我尝试这

我有一个应用程序使用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内容类型:application/X-www-form-urlencodedhttp://localhost:10555/api/v1/echo -d foo=1&bar=2按预期工作并返回:params{:foo 1,:bar 2},但我宁愿提交json。我知道我可能会使用compojure api,但我很好奇为什么会这样。

您需要使用中间件,尤其是wrap json body来解析json参数:

wrap-json-body中间件将使用json内容类型将任何请求的主体解析为Clojure数据结构,并将其分配给:body键

这是处理JSON请求的首选方法

尝试在处理程序中添加中间件