11

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

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

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

4 回答 4

20

您需要将处理程序包装在compojure.handler/apicompojure.handler/site添加适当的中间件以访问:query-params. 这曾经在 中自动发生defroutes,但现在不再发生。一旦你这样做了,当你作为查询字符串点击时,{params :query-params}解构表单将params被绑定到。{"foo" "bar"}/remservicefoo=bar

(或者您可以wrap-params手动添加等等——它们位于各种ring.middleware.*命名空间中;请参阅(链接到 Compojure 1.0.1 中的相关文件)的代码以获取它们的名称。)compojure.handler

例如

(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 映射。

于 2012-01-23T01:47:13.917 回答
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"
于 2014-10-29T17:53:14.190 回答
0

HTTP-request-destructuring以compojure 1.6.1这样的方式为我工作:

  1. 加入[ring/ring-defaults "0.3.2"](因为命名空间从 1.2:dependencies开始被弃用,取而代之的是)project.cljcompojure.handler[ring-defaults]
  2. 加入[ring.middleware.defaults :refer :all]_ :require_your.routes.namespace
  3. add (def site (wrap-defaults app site-defaults))in your.routes.namespace,其中app通过声明(defroutes app ...
  4. 加入:ring {:handler your.routes.namespace/site}_project.clj
于 2018-06-24T06:06:11.360 回答
-1

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

(GET "/tweet/:folder/:detail" [folder detail :as req]
  (twitter-controller/tweet folder detail (-> req :params :oauth_verifier))
于 2013-09-26T14:40:29.197 回答