Clojure 访问Compojure查询字符串

Clojure 访问Compojure查询字符串,clojure,compojure,Clojure,Compojure,我试图从url查询字符串中提取一个值,但是我可以返回我认为是映射的内容,但是当我使用下面的代码时,它并没有按预期处理它。有人能告诉我如何访问返回的querystring数据结构中的特定值吗 您需要将处理程序包装在compojure.handler/api或compojure.handler/site中,以添加适当的中间件来访问:query params。这曾经在defroutes中自动发生,但现在不再发生了。一旦您这样做,当您以foo=bar作为查询字符串点击/remservice时,{par

我试图从url查询字符串中提取一个值,但是我可以返回我认为是映射的内容,但是当我使用下面的代码时,它并没有按预期处理它。有人能告诉我如何访问返回的querystring数据结构中的特定值吗


您需要将处理程序包装在
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"