Reputation: 10449
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.
Upvotes: 131
Views: 86471
Reputation: 3201
You can use the URIBuilder class included in Apache HTTPComponents Core5: import org.apache.httpcomponents.core5:httpcore5:5.2.1
, then:
URI uri = new URIBuilder("http://yourapi.com/rest")
.addParameter("count", "5")
.addParameter("filter", "full text search")
.build();
The httpcore5 has no dependencies but it's a 900kb jar file. If size matters, you can use this library instead: https://gitlab.com/mvysny/apache-uribuilder - I've only copied the URIBuilder out of httpcore5 and published the jar on Maven Central; the jar is 33kb.
Upvotes: 0
Reputation: 20356
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();
Upvotes: 15
Reputation: 25854
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
Upvotes: 20
Reputation: 2114
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());
Upvotes: 81
Reputation: 19320
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.
Upvotes: 1
Reputation: 5591
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.
Upvotes: 66
Reputation: 10449
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();
}
Upvotes: 29