I'm trying to pull a value out of the url query string however I can return what I believe is a map, however when i use the below code, it doesn't process it as expected. Can anyone advise how I access specific values in the returned querystring datastructure?
http://localhost:8080/remservice?foo=bar
(defroutes my-routes
(GET "/" [] (layout (home-view)))
(GET "/remservice*" {params :query-params} (str (:parameter params))))
You'll need to wrap your handler in compojure.handler/api
or compojure.handler/site
to add appropriate middleware to gain access to :query-params
. This used to happen automagically in defroutes
, but no longer does. Once you do that, the {params :query-params}
destructuring form will cause params
to be bound to {"foo" "bar"}
when you hit /remservice
with foo=bar
as the query string.
(Or you could add in wrap-params
etc. by hand -- these reside in various ring.middleware.*
namespaces; see the code of compojure.handler
(link to the relevant file in Compojure 1.0.1) for their names.)
E.g.
(defroutes my-routes
(GET "/remservice*" {params :query-params}
(str params)))
(def handler (-> my-routes compojure.handler/api))
; now pass #'handler to run-jetty (if that's what you're using)
If you now hit http://localhost:8080/remservice?foo=bar
, you should see {"foo" "bar"}
-- the textual representation of your query string parsed into a Clojure map.