jon077
jon077

Reputation: 10449

What is the idiomatic way to compose a URL or URI in Java?

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

Answers (8)

Martin Vysny
Martin Vysny

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

Tyler Liu
Tyler Liu

Reputation: 20356

Use OkHttp

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

Nick Grealy
Nick Grealy

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:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents:httpclient:4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework:spring-web:4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

See also: GIST > URI Builder Tests

Upvotes: 20

Chikei
Chikei

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

Mike Pone
Mike Pone

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

Mikael Gueck
Mikael Gueck

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

jon077
jon077

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

takete.dk
takete.dk

Reputation: 2715

Apache HTTPClient?

Upvotes: 56

Related Questions