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

时间:2009-05-19 14:29:54

标签: java url

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

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

7 个答案:

答案 0 :(得分:72)

从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.2起URIUtils.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());

答案 1 :(得分:60)

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

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

答案 2 :(得分:57)

答案 3 :(得分:29)

使用HTTPClient运行良好。

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();

}

答案 4 :(得分:7)

有很多库可以帮助你构建URI(不要重新发明轮子)。这里有三个让你入门:

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();

另请参阅: GIST > URI Builder Tests

答案 5 :(得分:7)

使用OkHttp

2019 ,有一个非常受欢迎的名为OkHttp的图书馆,已在GitHub上加上 32K 次。使用此库,您可以构建如下所示的URL:

import okhttp3.HttpUrl;

URL url = new HttpUrl.Builder()
    .scheme("http")
    .host("example.com")
    .port(4567)
    .addPathSegments("foldername/1234")
    .addQueryParameter("abc", "xyz")
    .build().url();

答案 6 :(得分:1)

在被抨击以建议URL类之后。我会接受评论者的建议并建议URI class。我建议你仔细查看URI的构造函数,因为类在创建后非常不可变 我认为这个构造函数允许您在URI中设置您可能需要的所有内容。

URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
          Constructs a hierarchical URI from the given components.