2012-01-22 9 views
9

URLクエリ文字列から値を引き出そうとしていますが、私はマップと思われるものを返すことができますが、以下のコードを使用すると期待通りに処理されません。返されたクエリ文字列データ構造の特定の値にどのようにアクセスするのかアドバイスできますか?Compojureクエリ文字列へのアクセス

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

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

ここに2つの質問があります。この関数はパラメータを取るか? GETとは何ですか?ここに私が求めている理由があります。 paramsから必要なものを抽出できるはずですが、paramsはどこにありますか? – octopusgrabbus

答えて

17

あなたは:query-paramsへのアクセスを得るために、適切なミドルウェアを追加するcompojure.handler/apicompojure.handler/siteであなたのハンドラをラップする必要があります。これは、defroutesで自動的に発生していましたが、もはやそれはありません。これを実行すると、をクエリ文字列としてfoo=barに設定すると、{params :query-params}構造解除フォームによってが{"foo" "bar"}にバインドされます。

(それとも、手でwrap-paramsなどに追加することができます - これらは、様々なring.middleware.*名前空間に存在し;。その名のCompojure 1.0.1で該当するファイルへのthe code of 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のマップに解析クエリ文字列のテキスト表現を。

+0

私はマップを返すようにしましたが、個々のエントリにアクセスできないようです(例: (:foo params)または(get params foo)または(map:foo params)は何も返しません。私はこの地図構造の周りの私の主な混乱が返ったと思う。 – Dale

+1

これはキーが文字列形式で保存されているためです。 '(get params" foo ")'を使う必要があります。代わりに、 ':query-params'の代わりに':params'を使うこともできます。Compojureの 'api'は' wrap-keyword-params'ミドルウェアに追加されているので、 ':params'マップは"キー化 "されています。 ':params'には両方のタイプのパラメータが含まれています(もう一方はフォームパラメータです;クエリパラメータは':params'マップのフォームパラメータを上書きします)。 –

+0

どうすればいいですか?/ users/123?sort = desc 私はベクトルにパラメータを渡しました。 –

-1

私はラッパーを必要とcompojure 1.2.0のデフォルトのアプリで:asディレクティブ

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

を使用することができないcompojure 1.1.5で運を持っていた、クエリ文字列のミドルウェアは、デフォルトで含まれそうです。そのような要求を検査することができます。

(GET "/" request (str request)) 

paramsキーを含むたくさんのものが必要です。

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

このように、応答のクエリパラメータにアクセスするための標準のClojure構造解除フォームを組み込むことができます。

ページは次のようになります。

上記ミハルによってコメントで述べたように
{"key1" "value1", "key2" "value2"} 

は、しかし、キーは文字列に変換され、あなたがそれらにアクセスしたい場合は、より便利に、シンボルの検索ではなく、関数getを使用する必要があります。

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

;;the response body should be "value1" 
関連する問題