Do you know any JDK service in Java 1.5 that knows to take care of URL appending? (taking care of putting "?" or "&" depends on the fact that the query param is the first one or not).
Thanks, Shay
Do you know any JDK service in Java 1.5 that knows to take care of URL appending? (taking care of putting "?" or "&" depends on the fact that the query param is the first one or not).
Thanks, Shay
This simple class for building URL saves me a lot of time:
public class LinkBuilder {
protected String scheme;
protected String host;
protected int port;
protected Map<String, String> args = new HashMap<String, String>();
protected String path;
protected String hash;
public LinkBuilder() {
this(null, null, 0, new HashMap<String, String>(), null, null);
}
protected LinkBuilder(LinkBuilder other) {
this.scheme = other.scheme;
this.host = other.host;
this.port = other.port;
this.args = new HashMap<String, String>();
if (other.args != null) {
this.args.putAll(other.args);
}
this.path = other.path;
this.hash = other.hash;
}
protected LinkBuilder(String schema, String host, int port, Map<String, String> args, String path, String hash) {
this.scheme = schema;
this.host = host;
this.port = port;
this.args = new HashMap<String, String>();
if (args != null) {
this.args.putAll(args);
}
this.path = path;
this.hash = hash;
}
public LinkBuilder(URI url) {
String query = url.getRawQuery();
if (query != null) {
for (String argLine : query.split("&")) {
if (argLine.length() > 0) {
int i = argLine.indexOf('=');
if (i != -1) {
args.put(argLine.substring(0, i), argLine.substring(i + 1));
}
else {
args.put(argLine, null);
}
}
}
}
this.scheme = url.getScheme();
this.host = url.getHost();
this.port = url.getPort();
this.path = url.getRawPath();
this.hash = url.getRawFragment();
}
public LinkBuilder url(URI url) {
return new LinkBuilder(url);
}
public LinkBuilder scheme(String schema) {
return new LinkBuilder(schema, host, port, args, path, hash);
}
public LinkBuilder host(String host) {
if (host.indexOf('/') != -1) {
throw new IllegalArgumentException("Wrong host name: " + host);
}
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder port(int port) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder hash(String hash) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder path(String path) {
return new LinkBuilder(scheme, host, port, args, path, hash);
}
public LinkBuilder arg(String name) {
return arg(name, null);
}
public LinkBuilder arg(String name, Object value) {
Map<String, String> newArgs = new HashMap<String, String>(args);
newArgs.put(name, value == null ? null : value.toString());
return new LinkBuilder(scheme, host, port, newArgs, path, hash);
}
public String build() {
StringBuilder buf = new StringBuilder();
if (scheme != null) {
buf.append(scheme);
}
buf.append("://");
if (host != null) {
buf.append(host);
}
if (port > 0 && !"https".equals(scheme)) {
buf.append(':').append(port);
}
if (path != null) {
if (path.charAt(0) != '/') {
buf.append('/');
}
buf.append(path);
}
else if (args.size() > 0 || hash != null) {
buf.append('/');
}
if (args.size() > 0) {
buf.append('?');
boolean first = true;
for (Entry<String, String> arg : args.entrySet()) {
if (!first) {
buf.append('&');
}
else {
first = false;
}
buf.append(URLEncoder.encode(arg.getKey(), "UTF-8"));
if (arg.getValue() != null && arg.getValue().length() > 0) {
buf.append("=").append(URLEncoder.encode(arg.getValue(), "UTF-8"));
}
}
}
if (hash != null) {
buf.append('#').append(hash);
}
return buf.toString();
}
public String toString() {
return build();
}
}
Usage is very simple:
new LinkBuilder()
.scheme("http")
.host("stackoverflow.com")
.path("/questions/3253058/how-to-append-url-in-java/3253350")
.hash("3253350")
.build(); // Generates link to this post
new LinkBuilder(new URI("http://www.google.com/search"))
.arg("q", "Bugs Bunny")
.arg("ie", "UTF-8")
.build(); // Results in http://www.google.com/search?q=Bugs+Bunny&ie=UTF-8
Hope this helps.
A rather straightforward example (and very similar to Noel M's example who posted his while I was writing this) would be:
StringBuilder sb = new StringBuilder(url);
url.indexOf("?") > -1 ? sb.append("&") : sb.append("?");
// loop over your paramaters and append them like in Noel M's example
url = sb.toString();
public String buildUrl(String url, List<String> params) {
StringBuilder builder = new StringBuilder(url);
if(params != null && params.size() > 0) {
builder.append("?");
for(Iterator<String> i = params.iterator(); i.hasNext();) {
String s = i.next();
builder.append(s);
if(i.hasNext()) {
builder.append("&");
}
}
}
return builder.toString();
}