【问题标题】:Build URL in java在java中构建URL
【发布时间】:2017-01-22 18:02:00
【问题描述】:

尝试构建http://IP:4567/foldername/1234?abc=xyz。我对此了解不多,但我通过谷歌搜索编写了以下代码:

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

public class MyUrlConstruct {

    public static void main(String a[]){

        try {
            String protocol = "http";
            String host = "IP";
            int port = 4567;
            String path = "foldername/1234";
            URL url = new URL (protocol, host, port, path);
            System.out.println(url.toString()+"?");
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
    }
}

我能够建立 URL http://IP:port/foldername/1234?。我被困在查询部分。请帮助我前进。

【问题讨论】:

  • @px06 url 需要转义和验证,concat 不会削减它,因为如果abc=xyz 包含其他一些=, ? or & 它将被破坏。为此使用专用的库,但对于极其简单的情况 concat 可能会起作用。
  • How to build url in java?的可能重复
  • 从 Java 7 开始,有一个 (EE) 内置函数 javax.ws.rs.core.UriBuilder 可以为您执行此操作。

标签: java url build


【解决方案1】:

你可以只传递原始规范

new URL("http://IP:4567/foldername/1234?abc=xyz");

或者您可以使用 org.apache.http.client.utils.URIBuilder 之类的内容,并使用正确的 url 编码以安全的方式构建它

URIBuilder builder = new URIBuilder();
builder.setScheme("http");
builder.setHost("IP");
builder.setPath("/foldername/1234");
builder.addParameter("abc", "xyz");
URL url = builder.build().toURL();

【讨论】:

  • 感谢 Apache http 客户端库,已经将这个库作为依赖项,非常有用且简单。
  • 请注意,此构建器也可用于部分 url 构建,例如仅用于参数:... builder.addParameter(...); ... builder.toString() 将仅返回此部分,即使缺少其他部分。
【解决方案2】:

使用 OkHttp

有一个非常受欢迎的库,名为 OkHttp,它在 GitHub 上已被加星标 20K 次。使用此库,您可以构建如下所示的 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 url = HttpUrl.parse("http://example.com:4567/foldername/1234?abc=xyz").url();

【讨论】:

  • 如果您只需要构建一个 URL 字符串,我会避免使用完整的 HTTP 客户端。对于轻量级任务来说,这是一个严重的依赖项。
  • @NeuroXc 是的,你说的很有道理。我来自 Node.js 世界,那里是依赖地狱,所以我习惯于管理依赖。另一方面,它并没有那么糟糕,因为重度依赖不会使您的应用程序变慢。它会让你的应用程序更大。所以这取决于。这可能是一个问题,但在某些情况下人们并不关心它。
  • 我在从旧的 Http 客户端迁移到 okhttp 时使用了您的解决方案,必须在代码库的 onc 位置手动构建 Url。谢谢你!我们也可以使用HttpUrl url 代替URL url
【解决方案3】:

在一般的非 Java 术语中,URL 是一种特殊类型的 URI。您可以使用URI 类(它比自Java 1.0 以来就存在的古老的URL 类更现代)更可靠地创建URI,并且您可以使用URI 的toURL 方法将其转换为URL :

String protocol = "http";
String host = "example.com";
int port = 4567;
String path = "/foldername/1234";
String auth = null;
String fragment = null;
URI uri = new URI(protocol, auth, host, port, path, query, fragment);
URL url = uri.toURL();

注意path 需要以斜杠开头。

【讨论】:

  • 如果我必须在这段代码中使用“&”进行用户片段,我该如何使用它?例如“IP:4567/foldername/1234?abc=xyz&def=stu
  • 那不是片段。这只是多个查询参数。不幸的是,URI 目前还不容易组装这些;您必须自己构建查询字符串。请注意,查询参数值通常需要为encoded
  • 正如其他人所说,这对于简单的情况是可以的,但是如果您还需要转义参数,这将是有问题的(&,?,=,...)
  • @ChristopheRoussy 这是an open bug,出于某种原因,Oracle 似乎认为不值得费心解决。
  • @VGR 可能是为了向后兼容?
【解决方案4】:

如果您碰巧已经在使用 Spring,我发现 org.springframework.web.util.UriComponentsBuilder 非常漂亮。以下是您将如何使用它。

final URL myUrl = UriComponentsBuilder
        .fromHttpUrl("http://IP:4567/foldername/1234?abc=xyz")
        .build()
        .toUri()
        .toURL();

【讨论】:

    【解决方案5】:

    如果使用 Spring 框架:

    UriComponentsBuilder.newInstance()
      .scheme(scheme)
      .host(host)
      .path(path)
      .build()
      .toUri()
      .toURL();
    

    一个新的 UriComponentsBuilder 类有助于创建 UriComponents 实例通过提供对所有方面的细粒度控制 准备一个 URI,包括从模板构建、扩展 变量和编码。

    了解更多: https://www.baeldung.com/spring-uricomponentsbuilder

    Java 文档: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/UriComponentsBuilder.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2021-04-11
      • 2010-10-13
      • 1970-01-01
      • 2014-08-04
      • 2011-01-14
      • 1970-01-01
      相关资源
      最近更新 更多