访问Compojure查询字符串

时间:2012-01-22 17:54:32

标签: clojure compojure

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

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

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

4 个答案:

答案 0 :(得分:18)

您需要将处理程序包装在compojure.handler/apicompojure.handler/site中,以添加适当的中间件以获取对:query-params的访问权限。这曾经在defroutes中自动发生,但不再发生。执行此操作后,当{params :query-params}params作为查询字符串时,{"foo" "bar"}解构表单将/remservice绑定到foo=bar

(或者您可以手动添加wrap-params等 - 这些名称驻留在各种ring.middleware.*名称空间中;请参阅the code of compojure.handler(链接到Compojure 1.0.1中的相关文件)他们的名字。)

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)

如果你现在点击http://localhost:8080/remservice?foo=bar,你应该看到{"foo" "bar"} - 你的查询字符串的文本表示被解析为Clojure地图。

答案 1 :(得分:1)

在compojure 1.2.0的默认应用程序中,默认情况下包含查询字符串中间件。您可以检查请求。

(GET "/" request (str request))

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

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

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

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

您的页面应如下所示。

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

然而,正如上面Michal的评论所指出的那样,键被转换为字符串,如果您想要访问它们,则需要使用get函数而不是更方便的符号查找。

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

;;the response body should be "value1"

答案 2 :(得分:0)

通过compojure 1.6.1,HTTP-request-destructuring通过以下方式为我工作:

  1. 在{{1}中的[ring/ring-defaults "0.3.2"]中添加:dependencies(因为自1.2起,project.clj名称空间已被弃用,以compojure.handler为准)
  2. [ring-defaults]的{​​{1}}中添加[ring.middleware.defaults :refer :all]
  3. :require中添加your.routes.namespace,其中(def site (wrap-defaults app site-defaults))是通过your.routes.namespace声明的
  4. app中添加(defroutes app ...

答案 3 :(得分:-1)

我在compojure 1.1.5中运气不需要包装器并且能够使用:as指令

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