2012-01-22 53 views
9

我试图从url查询字符串中拉出一个值,但是我可以返回我认为是一个地图,但是当我使用下面的代码时,它不按预期处理它。任何人都可以建议我如何访问返回的查询字符串数据结构中的特定值?访问Compojure查询字符串

http://localhost:8080/remservice?foo=bar

(defroutes my-routes 
    (GET "/" [] (layout (home-view))) 
    (GET "/remservice*" {params :query-params} (str (:parameter params)))) 
+0

这里有两个问题。这个函数是否需要一个参数?什么是GET?这就是我问的原因。你应该能够从params中提取你需要的东西,但params在哪里? – octopusgrabbus

回答

17

你需要换你的处理程序compojure.handler/apicompojure.handler/site添加合适的中间件来获得对:query-params访问。这用于在defroutes中自动发生,但不再发生。一旦你这样做了,当你点击/remservicefoo=bar作为查询字符串时,{params :query-params}解构表单将导致params绑定到{"foo" "bar"}

(或者你可以在wrap-params等手工添加 - 这些居住在不同的命名空间ring.middleware.*;看到the code of compojure.handler(因为他们的名字链接到的Compojure 1.0.1相关文件))

例如

(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) 

如果你现在打http://localhost:8080/remservice?foo=bar,你应该看到{"foo" "bar"} - 解析成一个Clojure的地图查询字符串的文字表述。

+0

好吧,我已经得到它返回一张地图,但我似乎无法访问个别条目,例如(:foo params)或(get params foo)或(map:foo params)不返回任何内容。我认为这是围绕这个地图结构的主要困惑返回。 – Dale

+1

这是因为键保持字符串形式 - 你需要使用'(get params“foo”)'。或者,您可以使用':params'而不是':query-params' - Compojure的'api'在wrap-keyword-params中间件中添加了':params'映射, ':params'包含两种类型的参数(另一种是表单参数;查询参数覆盖':params'映射中的表单参数)。 –

+0

你如何做这样的事情:/ users/123?sort = desc 我有params传递给向量。 –

-1

我的Compojure有运气1.1.5不需要包装,并能够使用:as指令

(GET "/tweet/:folder/:detail" [folder detail :as req] 
    (twitter-controller/tweet folder detail (-> req :params :oauth_verifier)) 
0

在预设应用程式的Compojure 1.2.0,查询字符串中间件似乎默认包含。您可以像这样检查请求。

(GET "/" request (str request)) 

它应该有很多东西,包括params键。

{ . . . :params {:key1 "value1" :key2 "value2} . . . } 

因此,您可以包含一个标准的Clojure解构形式来访问响应中的查询参数。

(GET "/" {params :params} (str params)) 

您的页面应该如下所示。

{"key1" "value1", "key2" "value2"} 

如由米哈尔上面的评论指出,然而,键转换为字符串,如果你想访问他们,你需要使用get函数,而不是更方便的符号查找。

(GET "/" {params :params} (get params "key1")) 

;;the response body should be "value1"