2016-11-29 10 views
0

をキーワークマップとしてというクエリ文字列にマップすることができます。Compojure - 文字列キーを使用したクエリパラメータのマップ

(defroutes my-routes 
    (GET "/" {params :query-params} params)) 

しかし文字列キー付きマップと同じことを行う方法はありますか? (Compojureまたはリングを使用して

ここでのポイントは、マップの反復処理や関数を使用していますが、デフォルトで文字列キーでそれを作成することではありません。

{ :a "b" } -> {"a" "b"} 
+0

ミドルウェアを使用していますか? 'ring.middleware.params' –

答えて

1

Compojure 1.5.1(任意のミドルウェアを使用しないことで)、デフォルトですべてのクエリ文字列を解析しません。ただし、これは以前のバージョンでは異なる可能性があります。

(require '[compojure.core :refer :all]) 
(require '[clojure.pprint :refer [pprint]]) 

(defroutes handler 
    (GET "/" x 
     (with-out-str (pprint x)))) ;; just a way to receive a pretty printed string response 

$ curl localhost:3000/?a=b 
{:ssl-client-cert nil, 
:protocol "HTTP/1.1", 
:remote-addr "127.0.0.1", 
:params {}, ;; EMPTY! 
:route-params {}, 
:headers 
{"user-agent" "curl/7.47.1", "accept" "*/*", "host" "localhost:3000"}, 
:server-port 3000, 
:content-length nil, 
:compojure/route [:get "/"], 
:content-type nil, 
:character-encoding nil, 
:uri "/", 
:server-name "localhost", 
:query-string "a=b", ;; UNPARSED QUERY STRING 
:body 
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x6756d3a3 "[email protected]"], 
:scheme :http, 
:request-method :get} 

リングは、クエリ文字列を解析してのparams - キーの下に、それのハッシュマップを作成ring.params.wrap-paramsミドルウェアを提供しています:

(defroutes handler 
    (wrap-params (GET "/" x 
       (prn-str (:params x))))) 

$ curl localhost:3000/?a=55 
{"a" "55"} 

Additionaly ring.params.wrap-paramsを使用することができます。

(defroutes handler 
    (wrap-params (wrap-keyword-params (GET "/" x 
            (prn-str (:params x)))))) 

$ curl localhost:3000/?a=55 
{:a "55"} 
0
compojureわから

ないが、あなたはそれを自分で元に戻すことができます。

(use 'clojure.walk) 

(stringify-keys {:a 1 :b {:c {:d 2}}}) 
;=> {"a" 1, "b" {"c" {"d" 2}}} 

https://clojuredocs.org/clojure.walk/stringify-keys

+0

を使用するとき、または手動で' string string-keyed map 'を得る: '(defn stringify-keys [m]( - >>(seq m)(map#(update%0 name)) {}))) 'もちろん、ネストされたマップは扱いません。 –

+0

私はすでに 'stringfy-keys'を使っています。しかし、マップを作成した後でマップをもう一度反復するのは効率的ではないと思います(マップのキーは既に作成時に文字列からキーワードに変換されています)。デフォルトでは、文字列キーを使用してマップを作成するソリューションが必要です。 –

関連する問題