How do I build a URL or a URI in Java? Is there an idiomatic way, or libraries that easily do this?
I need to allow starting from a request string, parse/change various URL parts (scheme, host, path, query string) and support adding and automatically encoding query parameters.
A URI is a uniform resource identifier while a URL is a uniform resource locator. Hence every URL is a URI, abstractly speaking, but not every URI is a URL. This is because there is another subcategory of URIs, uniform resource names (URNs), which name resources but do not specify how to locate them.
The getURI() function of URL class converts the URL object to a URI object. Any URL which compiles with RFC 2396 can be converted to URI. URLs which are not in the specified format will generate an error if converted to URI format.
Uniform Resource Identifier (URI) − a sequence of characters that allows the complete identification of any abstract or physical resource.
kotlin.Any. ↳ java.net.URI. Represents a Uniform Resource Identifier (URI) reference.
As of Apache HTTP Component HttpClient 4.1.3, from the official tutorial:
public class HttpClientTest {
public static void main(String[] args) throws URISyntaxException {
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
URLEncodedUtils.format(qparams, "UTF-8"), null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
//http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
}
}
Edit: as of v4.2 URIUtils.createURI()
has been deprecated in favor of URIBuilder
:
URI uri = new URIBuilder()
.setScheme("http")
.setHost("www.google.com")
.setPath("/search")
.setParameter("q", "httpclient")
.setParameter("btnG", "Google Search")
.setParameter("aq", "f")
.setParameter("oq", "")
.build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
As the author, I'm probably not the best person to judge if my URL/URI builder is good, but here it nevertheless is: https://github.com/mikaelhg/urlbuilder
I wanted the simplest possible complete solution with zero dependencies outside the JDK, so I had to roll my own.
Apache HTTPClient?
Using HTTPClient worked well.
protected static String createUrl(List<NameValuePair> pairs) throws URIException{
HttpMethod method = new GetMethod("http://example.org");
method.setQueryString(pairs.toArray(new NameValuePair[]{}));
return method.getURI().getEscapedURI();
}
There are plenty of libraries that can help you with URI building (don't reinvent the wheel). Here are three to get you started:
import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();
import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();
import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();
See also: GIST > URI Builder Tests
It's 2022 and there is a very popular library named OkHttp which has been starred 41K times on GitHub. With this library, you can build an url like below:
import okhttp3.HttpUrl;
URL url = new HttpUrl.Builder()
.scheme("http")
.host("example.com")
.port(4567)
.addPathSegments("foldername/1234")
.addQueryParameter("abc", "xyz")
.build().url();
After being lambasted for suggesting the URL class. I will take the commenter's advice and suggest the URI class instead. I suggest you look closely at the constructors for a URI as the class is very immutable once created.
I think this constructor allows you to set everything in the URI that you could need.
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
Constructs a hierarchical URI from the given components.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With