Clojure 访问Compojure查询字符串
我试图从url查询字符串中提取一个值,但是我可以返回我认为是映射的内容,但是当我使用下面的代码时,它并没有按预期处理它。有人能告诉我如何访问返回的querystring数据结构中的特定值吗Clojure 访问Compojure查询字符串,clojure,compojure,Clojure,Compojure,我试图从url查询字符串中提取一个值,但是我可以返回我认为是映射的内容,但是当我使用下面的代码时,它并没有按预期处理它。有人能告诉我如何访问返回的querystring数据结构中的特定值吗 您需要将处理程序包装在compojure.handler/api或compojure.handler/site中,以添加适当的中间件来访问:query params。这曾经在defroutes中自动发生,但现在不再发生了。一旦您这样做,当您以foo=bar作为查询字符串点击/remservice时,{par
您需要将处理程序包装在
compojure.handler/api
或compojure.handler/site
中,以添加适当的中间件来访问:query params
。这曾经在defroutes
中自动发生,但现在不再发生了。一旦您这样做,当您以foo=bar
作为查询字符串点击/remservice
时,{params:query params}
解构表单将导致params
绑定到{foo”“bar}
(或者您可以手动添加wrap参数
等--这些参数驻留在各种ring.middleware.*
名称空间中;它们的名称请参见(链接到Compojure 1.0.1中的相关文件)
例如
如果您现在点击
http://localhost:8080/remservice?foo=bar
,您应该会看到{“foo”“bar”}
——解析为Clojure映射的查询字符串的文本表示形式。我很幸运,compojure 1.1.5不需要包装器,并且能够使用:as
指令
(GET "/tweet/:folder/:detail" [folder detail :as req]
(twitter-controller/tweet folder detail (-> req :params :oauth_verifier))
在compojure 1.2.0的默认应用程序中,querystring中间件似乎默认包括在内。您可以这样检查请求
(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"
使用
compojure 1.6.1
HTTP请求解构对我来说是这样的:
:project.clj
中添加[ring/ring defaults“0.3.2”]
(因为compoure.handler
命名空间从1.2开始就被弃用,取而代之的是[ring defaults]
):require
中添加[ring.middleware.defaults:refere:all]
您的.routes.namespace您的.routes.namespace
中添加(def站点(包装默认应用程序站点默认值))
,其中应用程序
通过(defroutes应用程序…
project.clj
这里有两个问题。这个函数是否接受一个参数?什么是GET?这就是我问的原因。你应该能够从params中提取你需要的东西,但是params在哪里?好的,我让它返回一个映射,但是我似乎无法访问单个条目,例如(:foo-params)或(GET-params-foo)或(map:foo-params)不返回任何内容。我认为这是我对返回的映射结构的主要困惑。这是因为键是以字符串形式保存的——您需要使用
(get params“foo”)
。或者,您可以使用:params
而不是:query params
——Compojure的api
添加到wrap关键字params
中间件中,因此:params
映射是“keyified”的——但请注意:params
包括这两种类型的参数(另一个是表单参数;查询参数覆盖:params
映射中的表单参数)。如何执行以下操作:/users/123?sort=desc我已将参数传递给向量。
{"key1" "value1", "key2" "value2"}
(GET "/" {params :params} (get params "key1"))
;;the response body should be "value1"