在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的方法。