访问Compojure查询字符串

Dal*_*ale 10 clojure compojure

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

HTTP://本地主机:8080/remservice富=酒吧

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

Mic*_*zyk 18

您需要将处理程序包装在其中compojure.handler/apicompojure.handler/site添加适当的中间件以获取访问权限:query-params.这曾经是自动发生的defroutes,但不再发生.一旦你这样做,{params :query-params}解构形式会导致params绑定到{"foo" "bar"},当你打/remservicefoo=bar作为查询字符串.

(或者您可以wrap-params手动添加等等 - 这些ring.middleware.*名称驻留在各种名称空间中;请参阅代码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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是因为密钥以字符串形式保留-您需要使用`(get params“ foo”)`。另外,您也可以使用:params而不是:query-params-Compojure的api在中间包装中添加了wrap-keyword-params中间件,因此map:map是“ keyified”的-但请注意:params`包含两种类型的参数(另一种是表单参数;查询参数将覆盖`:params`映射中的表单参数)。 (2认同)