Skip to content

Commit ea4b720

Browse files
author
Jonathan Wardell Avery
committed
allow nested array query params
1 parent 1cc8be6 commit ea4b720

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

src/clj_http/client.clj

+23-11
Original file line numberDiff line numberDiff line change
@@ -965,20 +965,32 @@
965965
([req respnd raise]
966966
(client (form-params-request req) respnd raise))))
967967

968+
(defn- subscript [k i]
969+
(str (name k) \[ i \]))
970+
971+
(defn- unnest-1 [param-assoc]
972+
(mapcat (fn [[k v]]
973+
(if (sequential? v)
974+
(map-indexed (fn [i sv] [(subscript k (str i)) sv]) v)
975+
(map (fn [[i sv]] [(subscript k (name i)) sv]) (seq v))))
976+
param-assoc))
977+
978+
(defn- unnest-inner [param-assoc]
979+
(let [{nested true flat false} (group-by (comp coll? second) param-assoc)]
980+
(if (empty? nested)
981+
param-assoc
982+
(concat flat (unnest-inner (unnest-1 nested))))))
983+
984+
(defn- unnest [params]
985+
(->> (seq params)
986+
unnest-inner
987+
(apply concat)
988+
(apply hash-map)))
989+
968990
(defn- nest-params
969991
[request param-key]
970992
(if-let [params (request param-key)]
971-
(assoc request param-key (prewalk
972-
#(if (and (vector? %) (map? (second %)))
973-
(let [[fk m] %]
974-
(reduce
975-
(fn [m [sk v]]
976-
(assoc m (str (name fk)
977-
\[ (name sk) \]) v))
978-
{}
979-
m))
980-
%)
981-
params))
993+
(assoc request param-key (unnest params))
982994
request))
983995

984996
(defn- nest-params-request

test/clj_http/test/client_test.clj

+8
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,14 @@
12721272
{:query-params {"a" {"b" {"c" "d"}}}
12731273
:form-params {"a[b][c]" "d"}
12741274
:flatten-nested-keys [:form-params]})
1275+
(is-applied (comp client/wrap-form-params
1276+
client/wrap-nested-params)
1277+
{:query-params {"a" [{"c" "d"} "e"]}
1278+
:form-params {"a" [{"c" "d"} "e"]}
1279+
:flatten-nested-keys [:form-params]}
1280+
{:query-params {"a" [{"c" "d"} "e"]}
1281+
:form-params {"a[0][c]" "d" "a[1]" "e"}
1282+
:flatten-nested-keys [:form-params]})
12751283
(is-applied (comp client/wrap-form-params
12761284
client/wrap-nested-params)
12771285
{:query-params {"a" {"b" {"c" "d"}}}

0 commit comments

Comments
 (0)