如何在Java中创建URL或URI?有没有一种惯用的方法,或者有没有一个库可以很容易地做到这一点?我需要允许从请求字符串开始,解析/更改各种URL部分(方案,主机,路径,查询字符串),并支持添加和自动编码查询参数。
xmd2e60i1#
从Apache HTTP组件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:
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());
k4emjkb12#
作为作者,我可能不是判断我的URL/URI构建器是否 * 好 * 的最佳人选,但它仍然是:https://github.com/mikaelhg/urlbuilder我想要一个尽可能简单的完整解决方案,在JDK之外没有依赖性,所以我不得不自己动手。
nafvub8i3#
Apache HTTPClient?
r8uurelv4#
使用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(); }
t2a7ltrp5#
有很多库可以帮助您构建URI(不要重新发明轮子)。这里有三个让你开始:
import javax.ws.rs.core.UriBuilder; ... return UriBuilder.fromUri(url).queryParam(key, value).build();
import org.apache.http.client.utils.URIBuilder; ... return new URIBuilder(url).addParameter(key, value).build();
import org.springframework.web.util.UriComponentsBuilder; ... return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();
参见:GIST > URI Builder Tests
ego6inou6#
现在是2022,有一个非常受欢迎的库名为OkHttp,它在GitHub上已经被引用了41K次。有了这个库,你可以像下面这样构建一个url:
import okhttp3.HttpUrl; URL url = new HttpUrl.Builder() .scheme("http") .host("example.com") .port(4567) .addPathSegments("foldername/1234") .addQueryParameter("abc", "xyz") .build().url();
xmakbtuz7#
因为建议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.
vfh0ocws8#
您可以使用Apache HTTPComponents Core 5中包含的URIBuilder类:导入org.apache.httpcomponents.core5:httpcore5:5.2.1,然后:
org.apache.httpcomponents.core5:httpcore5:5.2.1
URI uri = new URIBuilder("http://yourapi.com/rest") .addParameter("count", "5") .addParameter("filter", "full text search") .build();
httpcore 5没有依赖项,但它是一个900 kb的jar文件。如果大小很重要,你可以使用这个库:https://gitlab.com/mvysny/apache-uribuilder-我只从httpcore 5中复制了URIBuilder并在Maven Central上发布了jar; jar是33 kb。
8条答案
按热度按时间xmd2e60i1#
从Apache HTTP组件HttpClient 4.1.3开始,来自官方tutorial:
编辑:从v4.2开始,
URIUtils.createURI()
已被弃用,而支持URIBuilder
:k4emjkb12#
作为作者,我可能不是判断我的URL/URI构建器是否 * 好 * 的最佳人选,但它仍然是:https://github.com/mikaelhg/urlbuilder
我想要一个尽可能简单的完整解决方案,在JDK之外没有依赖性,所以我不得不自己动手。
nafvub8i3#
Apache HTTPClient?
r8uurelv4#
使用HTTPClient工作得很好。
t2a7ltrp5#
有很多库可以帮助您构建URI(不要重新发明轮子)。这里有三个让你开始:
Java EE 7
org.apache.httpcomponents:httpclient:4.5.2
org.springframework:spring-web:4.2.5.RELEASE
参见:GIST > URI Builder Tests
ego6inou6#
使用OkHttp
现在是2022,有一个非常受欢迎的库名为OkHttp,它在GitHub上已经被引用了41K次。有了这个库,你可以像下面这样构建一个url:
xmakbtuz7#
因为建议URL类而被痛斥。我会接受评论者的建议,建议使用URI class。我建议您仔细查看URI的构造函数,因为类一旦创建就非常不可变。
我认为这个构造函数允许您在URI中设置您可能需要的所有内容。
vfh0ocws8#
您可以使用Apache HTTPComponents Core 5中包含的URIBuilder类:导入
org.apache.httpcomponents.core5:httpcore5:5.2.1
,然后:httpcore 5没有依赖项,但它是一个900 kb的jar文件。如果大小很重要,你可以使用这个库:https://gitlab.com/mvysny/apache-uribuilder-我只从httpcore 5中复制了URIBuilder并在Maven Central上发布了jar; jar是33 kb。