Как получить параметры запроса в clojurescript?
Я использую секретар и реагент. Это мой код:
(def view (atom nil))
(defn layout [view]
[:div @view])
(reagent/render-component [layout view] (.getElementById js/document "message"))
(secretary/set-config! :prefix "")
(secretary/defroute home-path "/" [query-params]
(timbre/info "Path : /, query params : " query-params)
(let [warning (:warning query-params)
success (:success query-params)
login-failed (:login_failed query-params)]
(when warning
(timbre/info "Warning found : " warning)
(reset! view [:h4 [:span.label.label-warning warning]]))
(when success
(timbre/info "Success found : " success)
(reset! view [:h4 [:span.label.label-info success]]))
(when login-failed
(timbre/info "Login failed")
(reset! view [:h4 [:span.label.label-warning "Login Failed."]]))))
(let [h (History.)]
(goog.events/listen h EventType.NAVIGATE #(secretary/dispatch! (.-token %)))
(doto h
(.setEnabled true)))
Не учитывая значение префикса: (я пробовал "", "#", а также вообще не устанавливая префикс:), этот код работает только с маршрутами, такими как:
http://localhost:8080/login#/?success=SuccessMessage
Но это не работает с маршрутами, такими как:
http://localhost:8080/login?success=SuccessMessage
Чего я на самом деле пытаюсь добиться, так это проанализировать ошибку входа в систему от друга, который в случае ошибки перенаправляет меня на
http://localhost:8080/login?&login_failed=Y&username=someUser
и отобразить сообщение об ошибке входа в систему пользователю. Мне не нужно использовать секретаря для этого, все, что работает для анализа параметров запроса, будет в порядке для меня.
Трудным путем было бы проанализировать строку запроса, которую я могу получить:
(-> js/window .-location .-search)
Я считаю, что это уже хорошо сделано в какой-то библиотеке.
1 ответ
Я нашел это. Используя https://github.com/cemerick/url (работает как для clojure, так и для clojurescript), можно сделать:
(require '[cemerick.url :as url])
(:query (url/url (-> js/window .-location .-href)))
Из документов:
Если URI содержит строку запроса, он будет автоматически извлечен в:query-params для сопоставлений строковых маршрутов и до последнего элемента для сопоставителей регулярных выражений.
(defroute "/users/:id" [id query-params]
(js/console.log (str "User: " id))
(js/console.log (pr-str query-params)))
(defroute #"/users/(\d+)" [id {:keys [query-params]}]
(js/console.log (str "User: " id))
(js/console.log (pr-str query-params)))
;; In both instances...
(secretary/dispatch! "/users/10?action=delete")
;; ... will log
;; User: 10
;; "{:action \"delete\"}"