diff --git a/pom.xml b/pom.xml index d7af862..a0a25ab 100644 --- a/pom.xml +++ b/pom.xml @@ -127,8 +127,8 @@ org.hamcrest - hamcrest-core - 1.3 + hamcrest-junit + 2.0.0.0 test diff --git a/src/main/java/si/mazi/rescu/Params.java b/src/main/java/si/mazi/rescu/Params.java index cb11518..481ab6d 100644 --- a/src/main/java/si/mazi/rescu/Params.java +++ b/src/main/java/si/mazi/rescu/Params.java @@ -25,6 +25,7 @@ import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLEncoder; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.regex.Matcher; @@ -86,12 +87,21 @@ public Params add(String param, Object value) { private String toQueryString(boolean encode) { StringBuilder b = new StringBuilder(); - for (String param : data.keySet()) { - if (isParamSet(param)) { - if (b.length() > 0) { - b.append('&'); + for (String paramName : data.keySet()) { + if (isParamSet(paramName)) { + Object originalValue = getParamValue(paramName); + boolean createArrayParameters = originalValue instanceof Iterable && paramName.endsWith("[]"); + @SuppressWarnings("unchecked") + Iterable paramValues = createArrayParameters + ? (Iterable)originalValue + : Collections.singleton(originalValue); + for (Object paramValue : paramValues) { + if (b.length() > 0) { + b.append('&'); + } + String paramValueAsString = toString(paramValue); + b.append(paramName).append('=').append(encode(paramValueAsString, encode)); } - b.append(param).append('=').append(encode(getParamValueAsString(param), encode)); } } return b.toString(); @@ -147,12 +157,12 @@ static String toString(Object paramValue) { if (paramValue instanceof BigDecimal) { return ((BigDecimal) paramValue).toPlainString(); } else if (paramValue instanceof Iterable) { - return collectionToString((Iterable) paramValue); + return iterableToString((Iterable) paramValue); } return paramValue.toString(); } - static String collectionToString(Iterable iterable) { + static String iterableToString(Iterable iterable) { final StringBuilder sb = new StringBuilder(); for (Object o : iterable) { if (sb.length() > 0) { diff --git a/src/test/java/si/mazi/rescu/ExampleService.java b/src/test/java/si/mazi/rescu/ExampleService.java index c4d5227..a864091 100644 --- a/src/test/java/si/mazi/rescu/ExampleService.java +++ b/src/test/java/si/mazi/rescu/ExampleService.java @@ -30,6 +30,7 @@ import javax.ws.rs.core.MediaType; import java.io.IOException; import java.math.BigDecimal; +import java.util.List; /** * @author Matija Mazi @@ -127,4 +128,13 @@ public interface ExampleService { @Consumes(MediaType.APPLICATION_JSON) DummyTicker testGetMethodWithBody(DummyAccountInfo ticker) throws IOException; + @POST + @Path("formPostCollection") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + Object testFromPostCollection(@FormParam("data") List data); + + @POST + @Path("formPostCollection") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + Object testFromPostCollectionAsArray(@FormParam("data[]") List data); } diff --git a/src/test/java/si/mazi/rescu/RestInvocationTest.java b/src/test/java/si/mazi/rescu/RestInvocationTest.java index 54775ac..4481a1d 100644 --- a/src/test/java/si/mazi/rescu/RestInvocationTest.java +++ b/src/test/java/si/mazi/rescu/RestInvocationTest.java @@ -30,9 +30,13 @@ import javax.ws.rs.HeaderParam; import javax.ws.rs.core.MediaType; import java.lang.annotation.Annotation; +import java.net.URLDecoder; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.testng.Assert.assertEquals; /** @@ -88,4 +92,28 @@ public void testCreateWithValueGenerator() { assertEquals(invocation.getParamValue(FormParam.class, "nonce"), nonce); } + @Test + public void testFormPostCollectionDefault() throws Exception { + TestRestInvocationHandler testHandler = new TestRestInvocationHandler(ExampleService.class, new ClientConfig(), null, 200); + ExampleService proxy = RestProxyFactory.createProxy(ExampleService.class, testHandler); + + proxy.testFromPostCollection(Arrays.asList("first", "second")); + + final String requestBody = URLDecoder.decode(testHandler.getInvocation().getRequestBody(), "UTF-8"); + assertThat(requestBody, containsString("data=first,second")); + } + + @Test + public void testFormPostCollectionArray() throws Exception { + ClientConfig config = new ClientConfig(); + + TestRestInvocationHandler testHandler = new TestRestInvocationHandler(ExampleService.class, config, null, 200); + ExampleService proxy = RestProxyFactory.createProxy(ExampleService.class, testHandler); + + proxy.testFromPostCollectionAsArray(Arrays.asList("first", "second")); + + final String requestBody = testHandler.getInvocation().getRequestBody(); + assertThat(requestBody, containsString("data[]=first")); + assertThat(requestBody, containsString("data[]=second")); + } }