【问题标题】:validate that URI is valid http URI验证 URI 是有效的 http URI
【发布时间】:2011-02-05 13:27:18
【问题描述】:

解决方案

好的,经过一番搜索,我在 Stackoverflow 上找到了 1 个解决方案,但我希望不用额外的库就可以做到。 How to check for a valid URL in Java?

我的问题:

首先希望这不是重复的,但我找不到正确的答案(马上)。我想验证 URI(http) 在 Java 中是否有效。我想出了以下测试,但我无法让它们通过。首先我使用getPort(),但随后http://www.google.nl 将在getPort() 上返回-1。这是我想通过的测试

测试:

@Test
public void testURI_Isvalid() throws Exception {
    assertFalse(HttpUtils.validateHTTP_URI("ttp://localhost:8080"));
    assertFalse(HttpUtils.validateHTTP_URI("ftp://localhost:8080"));
    assertFalse(HttpUtils.validateHTTP_URI("http://localhost:8a80"));
    assertTrue(HttpUtils.validateHTTP_URI("http://localhost:8080"));
    final String justWrong = 
        "/schedule/get?uri=http://localhost:8080&time=1000000";
    assertFalse(HttpUtils.validateHTTP_URI(justWrong));
    assertTrue(HttpUtils.validateHTTP_URI("http://www.google.nl"));
}

这是我在删除 getPort() 部分后想出的,但这并没有通过我所有的单元测试。

生产代码:

  public static boolean validateHTTP_URI(String uri) {
        final URI u;
        try {
            u = URI.create(uri);
        } catch (Exception e1) {
            return false;
        }
        return "http".equals(u.getScheme());
  }

这是第一个失败的测试,因为我不再验证 getPort() 部分。希望有人可以帮助我。我认为我没有使用正确的类来验证 URL?

附注:

我不想连接到服务器来验证 URI 是否正确。至少在这一步还没有。我只想验证方案。

【问题讨论】:

  • '我不想连接到服务器来验证 URI 是否正确' 为什么不呢?这是唯一决定性的决定方式。
  • @EJP 不同意。 IETF 发布的RFC 3986 明确建立了严格的语法。要使 URI 有效,您只需根据此语法对其进行验证。连接到它会验证服务器是否已注册并侦听该 URI,其中 1. 是与 URI 本身的有效性完全不同的条件,2. 使您的测试依赖于外部资源,而 3. 可以说是特定于实现的。 HTTP 客户端可以以任意数量的非标准方式运行。

标签: java uri validation


【解决方案1】:

将通过的代码

public static boolean validateHTTP_URI(String uri) {
    final URL url;
    try {
        url = new URL(uri);
    } catch (Exception e1) {
        return false;
    }
    return "http".equals(url.getProtocol());
}

我的下一个问题是:

我在某处听说/读到(我相信是 Joshua Bloch)如果您没有互联网(不再),Url 将无法正常工作。但我不认为这是真的(不再)?谁能详细说明一下。

【讨论】:

  • 网址涉及DNS。 URI 没有。
  • 所以如果我拔掉互联网,那么 URL 会失败吗?稍后会测试它。
  • URL 使用 DNS 来解析不同 URL 实例之间的相等性。因此,如果您在地图中使用 URL,如果您无法访问 Internet,则可能会失败。否则我认为 URL 类在您使用 openConnection 之前不会解析地址。
【解决方案2】:

你可以尝试使用这个正则表达式:

(?:(?<protocol>http(?:s?)|ftp)(?:\:\/\/)) (?:(?<usrpwd>\w+\:\w+)(?:\@))? (?<domain>[^/\r\n\:]+)? (?<port>\:\d+)? (?<path>(?:\/.*)*\/)? (?<filename>.*?\.(?<ext>\w{2,4}))? (?<qrystr>\??(?:\w+\=[^\#]+)(?:\&?\w+\=\w+)*)* (?<bkmrk>\#.*)?

这会告诉你一个 URL 是否有效,它会给你protocol 值。我不懂Java,所以我不知道您需要使用什么类来验证正则表达式。

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2011-03-23
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多