在Java中组合URL或URI的惯用方法是什么?

问题

如何在Java中构建URL或URI?是否有惯用的方式,或者很容易做到这一点的库?

我需要允许从请求字符串开始,解析/更改各种URL部分(方案,主机,路径,查询字符串)并支持添加和自动编码查询参数。


#1 热门回答(70 赞)

截至Apache HTTP Component HttpClient 4.1.3,来自官方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=
}
}

编辑:截至v4.2URIUtils.createURI()已被弃用,有利于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());

#2 热门回答(57 赞)

Apache HTTPClient


#3 热门回答(57 赞)

作为作者,我可能不是判断我的URL / URI构建器是否很好的最佳人选,但它仍然是:https://github.com/mikaelhg/urlbuilder

我想要最简单的完整解决方案,在JDK之外没有依赖关系,所以我不得不自己动手。