在Java中编写URL或URI的惯用方法是什么?

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

我需要允许从请求string开始,parsing/更改各种URL部分(scheme,主机,path,查询string),并支持添加和自动编码查询参数。

截至Apache HTTP组件HttpClient 4.1.3,从官方教程 :

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

Apache HTTPClient ?

作为作者,我可能不是判断我的URL / URI构build器是否合适的最佳人选,但这里却是: https : //github.com/mikaelhg/urlbuilder

我想在JDK之外提供最简单可能的零依赖关系的完整解决scheme,所以我不得不推出我自己的。

使用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(); } 

错误(RFE)6306820在java错误数据库中的地址。

在其中一个评论中,提供了一个到RFE实施的链接 。

有很多库可以帮助你build立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:弹簧网:4.2.5.RELEASE

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

另请参阅: GIST> URI生成器testing

在被推荐为URL类之后。 我将接受评论者的build议,并build议URI类 。 我build议你仔细看一下URI的构造函数,因为这个类一旦创build就非常不可变。
我认为这个构造函数允许你在URI中设置你可能需要的所有东西。

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

使用OkHttp

这是2017年 ,有一个非常stream行的图书馆名为OkHttp已经在GitHub上出演了20K次。 有了这个库,你可以build立一个如下所示的url:

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

URL类有很好的构造URL的方法。