在Java中,如何构造URL或URI?

t3irkdon  于 2023-06-20  发布在  Java
关注(0)|答案(8)|浏览(237)

如何在Java中创建URL或URI?有没有一种惯用的方法,或者有没有一个库可以很容易地做到这一点?
我需要允许从请求字符串开始,解析/更改各种URL部分(方案,主机,路径,查询字符串),并支持添加和自动编码查询参数。

xmd2e60i

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

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

k4emjkb12#

作为作者,我可能不是判断我的URL/URI构建器是否 * 好 * 的最佳人选,但它仍然是:https://github.com/mikaelhg/urlbuilder
我想要一个尽可能简单的完整解决方案,在JDK之外没有依赖性,所以我不得不自己动手。

r8uurelv

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

}
t2a7ltrp

t2a7ltrp5#

有很多库可以帮助您构建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

ego6inou

ego6inou6#

使用OkHttp

现在是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();
xmakbtuz

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.
vfh0ocws

vfh0ocws8#

您可以使用Apache HTTPComponents Core 5中包含的URIBuilder类:导入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。

相关问题