Skip to content

Commit a8d5e4d

Browse files
authored
Support multiple duplicate queryparams (#134)
The SendGrid API documentation states that the user can supply up to ten categories, but there is no way to supply them using the Java library. This commit fixes the problem by interpreting any value that has an ampersand in it as a list of values, which will be inserted as multiple query params. For example, the call request.addQueryParam("categories", "cat1&cat2") will output "?categories=cat1&categories=cat2" into the URL.
1 parent cccce61 commit a8d5e4d

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

Diff for: README.md

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ try {
100100
request.addHeader("Authorization", "Bearer YOUR_API_KEY");
101101
request.addQueryParam("limit", "100");
102102
request.addQueryParam("offset", "0");
103+
// Will be parsed to categories=cake&categories=pie&categories=baking
104+
request.addQueryParam("categories", "cake&pie&baking");
103105
request.setBody("{\"name\": \"My Request Body\"}");
104106
request.setMethod(Method.POST);
105107
String param = "param";

Diff for: src/main/java/com/sendgrid/Client.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.nio.charset.Charset;
1010
import java.util.HashMap;
1111
import java.util.Map;
12+
import java.util.Arrays;
13+
import java.util.List;
1214

1315
import org.apache.http.Header;
1416
import org.apache.http.HttpMessage;
@@ -129,8 +131,19 @@ public URI buildUri(String baseUri, String endpoint, Map<String, String> queryPa
129131
builder.setPath(endpoint);
130132

131133
if (queryParams != null) {
134+
String multiValueDelimiter = "&";
135+
132136
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
133-
builder.setParameter(entry.getKey(), entry.getValue());
137+
String value = entry.getValue();
138+
139+
if (value.indexOf(multiValueDelimiter) != -1) {
140+
List<String> values = Arrays.asList(value.split(multiValueDelimiter));
141+
for (String val : values) {
142+
builder.addParameter(entry.getKey(), val);
143+
}
144+
} else {
145+
builder.setParameter(entry.getKey(), entry.getValue());
146+
}
134147
}
135148
}
136149

Diff for: src/test/java/com/sendgrid/ClientTest.java

+24-4
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import java.io.IOException;
3434
import java.io.PrintWriter;
3535
import java.io.StringWriter;
36+
import java.net.MalformedURLException;
3637
import java.net.URI;
3738
import java.net.URISyntaxException;
39+
import java.net.URL;
3840
import java.util.HashMap;
3941
import java.util.Map;
4042

@@ -62,6 +64,7 @@ public void testbuildUri() {
6264
Map<String,String> queryParams = new HashMap<String,String>();
6365
queryParams.put("test1", "1");
6466
queryParams.put("test2", "2");
67+
queryParams.put("test3", "3&4&5");
6568
try {
6669
uri = client.buildUri(baseUri, endpoint, queryParams);
6770
} catch (URISyntaxException ex) {
@@ -70,10 +73,23 @@ public void testbuildUri() {
7073
Assert.assertTrue(errors.toString(), false);
7174
}
7275

73-
String url = uri.toString();
74-
System.out.println(url);
75-
Assert.assertTrue(url.equals("https://api.test.com/endpoint?test2=2&test1=1") ||
76-
url.equals("https://api.test.com/endpoint?test1=1&test2=2"));
76+
URL url = null;
77+
try {
78+
url = uri.toURL();
79+
} catch (MalformedURLException ex) {
80+
StringWriter errors = new StringWriter();
81+
ex.printStackTrace(new PrintWriter(errors));
82+
Assert.assertTrue(errors.toString(), false);
83+
}
84+
85+
Assert.assertTrue(url.getProtocol().equals("https"));
86+
Assert.assertTrue(url.getHost().equals("api.test.com"));
87+
Assert.assertTrue(url.getPath().equals("/endpoint"));
88+
Assert.assertTrue(this.queryParamHasCorrectValue(url, "test1", "1"));
89+
Assert.assertTrue(this.queryParamHasCorrectValue(url, "test2", "2"));
90+
Assert.assertTrue(this.queryParamHasCorrectValue(url, "test3", "3"));
91+
Assert.assertTrue(this.queryParamHasCorrectValue(url, "test3", "4"));
92+
Assert.assertTrue(this.queryParamHasCorrectValue(url, "test3", "5"));
7793
}
7894

7995
@Test
@@ -174,4 +190,8 @@ public void testPut() {
174190
public void testDelete() {
175191
testMethod(Method.DELETE, 204);
176192
}
193+
194+
private boolean queryParamHasCorrectValue(URL url, String key, String value) {
195+
return url.getQuery().indexOf(key + "=" + value) != -1;
196+
}
177197
}

0 commit comments

Comments
 (0)