Как именно обрабатываются тела запросов POST в Clojure? (http-kit, compojure) - PullRequest
0 голосов
/ 23 марта 2020

У меня есть страница с формой входа и сервер, который принимает запросы POST. Вот сервер:

(ns clj_server.core
  (:require [org.httpkit.server :refer [run-server]]
            [compojure.core :refer [defroutes POST]]
            [compojure.route :as route]
            [ring.middleware.params :refer [wrap-params]]))

(defn printPostBody [request]
  {:status 200
   :headers {"Content-Type" "text/html"}
   :body request})

(defroutes routes
  (POST "/login" request (printPostBody request))
  (route/not-found {:status 404 :body "<h1>Page not found</h1"}))

(def app (wrap-params routes))

(defn -main [& args]
  (run-server app {:port 8000})
  (println "Server started on port 8000"))

Когда я делаю запрос на вход в систему, это распечатывается:

[: remote-addr "0: 0: 0: 0: 0 : 0: 0: 1 "] [: params {" username "" asdf "," password "" ghkj "}] [: route-params {}] [: headers {" origin "" http://localhost: 3449"," host "" localhost: 8000 "," user-agent "" Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (K HTML, как Gecko) Chrome / 74.0.3729.172 Safari / 537.36 Vivaldi / 2.5.1525.46 "," content-type "" application / x- www-form-urlencoded "," content-length "" 27 "," referer "" http://localhost: 3449 /"," connection "" keep-alive "," запросы на обновление-небезопасность "" 1 "," accept "" text / html, application / xhtml + xml, application / xml; q = 0,9, image / webp , image / apng, / ; q = 0,8, приложение / подписанный обмен; v = b3 "," accept-language "" en-US, en; q = 0,9 "," accept-encoding " "gzip, deflate, br", "контроль кэша" "max-age = 0"}] [: asyn c -канал #object [org.httpkit.server.AsyncChannel 0x2212125a "/ 0: 0: 0: 0 : 0: 0: 0: 1: 8000 <-> / 0: 0: 0: 0: 0: 0: 0: 1: 50592 "]] [: server-port 8000] [: content-length 27] [: е orm-params {"username" "asdf", "password" "ghkj"}] [: compojure / route [: post "/ login"]] [: websocket? false] [: query-params {}] [: тип содержимого "application / x- www-form-urlencoded"] [: кодировка символов "utf8"] [: uri "/ login"] [: имя сервера "localhost" ] [: строка запроса nil] [: body #object [org.httpkit.BytesInputStream 0x4e67c6c0 "BytesInputStream [len = 27]"]] [: схема: http] [: метод запроса: post]

Так что мне интересно, что это за структура данных? Это не похоже на карту ha sh, но когда я печатаю (:params request) вместо request, я получаю

["username" "asdf"] ["password" "ghkj"]

Является ли ha sh -картой списка векторов? Я не понимаю, с какой структурой данных я имею здесь дело.

Кроме того, почему {"username" "asdf", "password" "ghkj"} преобразуется в ["username" "asdf"]["password" "ghkj"], когда я запрашиваю только параметры вместо всего запроса?

Затем я попытался распечатать (get (:params request) "username") и получил «asdf». Что имеет смысл, но как это позволяет мне использовать get для набора из нескольких векторов?

Наконец, как бы я обработал JSON в моих почтовых запросах? Это одно и то же, или мне придется обращаться с этим по-другому?

...