Created
January 11, 2016 21:28
-
-
Save inder123/4af55027e7c55176e821 to your computer and use it in GitHub Desktop.
UrlParams: A Builder class to construct URL parameters in Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.UnsupportedEncodingException; | |
import java.net.URLEncoder; | |
import java.util.ArrayList; | |
import java.util.List; | |
/** | |
* A class to create URL parameters in a builder-like fashion | |
* | |
* @author Inderjeet Singh | |
*/ | |
public class UrlParams { | |
// Using two lists instead of a map to ensure that parameters are printed in the order | |
// they were put. This also allows a key to appear multiple times. | |
private final List<String> keys = new ArrayList<String>(); | |
private final List<String> values = new ArrayList<String>(); | |
/** Adds the URL parameter if and only if both key and value are not empty */ | |
public UrlParams add(String key, String value) { | |
if (!isNullOrWhitespace(key) && !isNullOrWhitespace(value)) { | |
keys.add(key); | |
values.add(value); | |
} | |
return this; | |
} | |
public UrlParams add(String key, boolean value) { | |
keys.add(key); | |
values.add(String.valueOf(value)); | |
return this; | |
} | |
public UrlParams add(String key, List<String> strings) { | |
return add(key, toCsvString(strings)); | |
} | |
/** appends the parameters to a base URL in the form ?a=b&c=d */ | |
public void appendToUrl(StringBuilder sb) { | |
try { | |
boolean first = true; | |
for (int i = 0; i < keys.size(); ++i) { | |
if (first) { | |
first = false; | |
sb.append('?'); | |
} else { | |
sb.append('&'); | |
} | |
sb.append(URLEncoder.encode(keys.get(i), "UTF-8")); | |
sb.append('='); | |
sb.append(URLEncoder.encode(values.get(i), "UTF-8")); | |
} | |
} catch (UnsupportedEncodingException e) { | |
throw new RuntimeException(e); | |
} | |
} | |
@Override | |
public String toString() { | |
StringBuilder sb = new StringBuilder(); | |
appendToUrl(sb); | |
return sb.toString(); | |
} | |
private static boolean isNullOrWhitespace(String str) { | |
return str == null || str.trim().isEmpty(); | |
} | |
private static String toCsvString(List<String> strings) { | |
String value = null; | |
if (strings != null) { | |
StringBuilder sb = new StringBuilder(); | |
boolean first = true; | |
for (String str : strings) { | |
if (first) { | |
first = false; | |
} else { | |
sb.append(","); | |
} | |
sb.append(str); | |
} | |
value = sb.toString(); | |
} | |
return value; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import static org.junit.Assert.assertEquals; | |
import static org.junit.Assert.assertTrue; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.junit.Test; | |
/** | |
* Unit tests for {@link UrlParams}. | |
* | |
* @author Inderjeet Singh | |
*/ | |
public class UrlParamsTest { | |
@Test | |
public void testEscapedCharacters() { | |
UrlParams params = new UrlParams(); | |
assertEquals("", params.toString()); | |
params = new UrlParams().add("a", "b"); | |
assertEquals("?a=b", params.toString()); | |
params = new UrlParams().add("a", "b").add("c", "d"); | |
assertEquals("?a=b&c=d", params.toString()); | |
// Test the space character | |
params = new UrlParams().add("c", "Simple Test"); | |
String escaped = params.toString(); | |
assertTrue(escaped.equals("?c=Simple+Test") || escaped.equals("?c=Simple%20Test")); | |
// Test escaped characters | |
params = new UrlParams().add("c=", "ab,cd/ef%:"); | |
assertEquals("?c%3D=ab%2Ccd%2Fef%25%3A", params.toString()); | |
} | |
@Test | |
public void testValueAsStringList() { | |
UrlParams params = new UrlParams(); | |
List<String> strings = new ArrayList<String>(); | |
params.add("foo", strings); | |
assertEquals("", params.toString()); // array is empty so shouldn't go out as value | |
strings.add("a"); | |
strings.add("b & c"); | |
params.add("bar", strings); | |
assertEquals("?bar=a%2Cb+%26+c", params.toString()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment