diff --git a/spec/lucky/base_http_client_spec.cr b/spec/lucky/base_http_client_spec.cr index 45f0350c7..569669480 100644 --- a/spec/lucky/base_http_client_spec.cr +++ b/spec/lucky/base_http_client_spec.cr @@ -3,11 +3,23 @@ require "../spec_helper" class HelloWorldAction < TestAction accepted_formats [:plain_text] + param codes : Array(String)? + post "/hello" do plain_text "world" end end +class ArrayParamAction < TestAction + accepted_formats [:plain_text] + + param codes : Array(String) + + post "/array_param" do + plain_text codes.join("--") + end +end + class MyClient < Lucky::BaseHTTPClient app TestServer.new end @@ -46,6 +58,14 @@ describe Lucky::BaseHTTPClient do request = TestServer.last_request request.body.to_s.should eq({foo: "bar"}.to_json) end + + it "works with array query params" do + response = MyClient.new.exec ArrayParamAction.with(codes: ["ab", "xy"]) + response.body.should eq "ab--xy" + + request = TestServer.last_request + request.query.should eq("codes%5B%5D=ab&codes%5B%5D=xy") + end end describe "with a Lucky::RouteHelper" do diff --git a/src/lucky/routable.cr b/src/lucky/routable.cr index 786b5aafd..518a818f4 100644 --- a/src/lucky/routable.cr +++ b/src/lucky/routable.cr @@ -298,19 +298,25 @@ module Lucky::Routable {{ param.gsub(/^\?:/, "").id }}, {% end %} ) - query_params = {} of String => String - {% for param in PARAM_DECLARATIONS %} - # add query param if given and not nil - query_params["{{ param.var }}"] = {{ param.var }}.to_s unless {{ param.var }}.nil? - {% end %} + + query_params = URI::Params.build do |builder| + {% for param in PARAM_DECLARATIONS %} + _param = {{ param.var }} + + # add query param if given and not nil + unless _param.nil? + if _param.is_a?(Array) + builder.add("{{ param.var }}[]", _param.map(&.to_s)) + else + builder.add("{{ param.var }}", _param.to_s) + end + end + {% end %} + end + unless query_params.empty? io << '?' - {% if compare_versions(Crystal::VERSION, "1.10.0") < 0 %} - {% @type.warning("[Deprecated] Please update your Crystal version #{Crystal::VERSION}. Using Lucky with a version below 1.10.0 is deprecated.") %} - io << HTTP::Params.encode(query_params) - {% else %} - HTTP::Params.encode(io, query_params) - {% end %} + io << query_params end anchor.try do |value|