如何在 Java 中完全验证 URL

337 阅读6分钟

统一资源定位符 (URL) 用作 Internet 上唯一资源的地址。在我们的浏览器中输入网站 URL 可以检索构建我们正在访问的页面所需的 HTML/CSS 文件,而对端点 URL 进行 API 调用允许我们远程访问和/或修改重要数据——列表还在继续。URL 有效地促进了我们今天在互联网上认为理所当然的互连性。

当我们在 Web 应用程序中捕获 URL 字符串输入时,验证这些输入以确保 URL 有用至关重要。检索和存储任何形式的地址数据(无论是 URL 地址、IP 地址,甚至是物理街道地址)而不立即验证其效用都是浪费时间;当我们将来尝试访问重要资源时,它会让我们空手而归。

然而,自动化 URL 验证并不像听起来那么简单。任何给定的 URL 都可能同时出现多个问题,其中一些问题比其他问题更难发现,也更耗费资源。我们可以从语法的角度来看待 URL 的有效性(即确保 URL 的格式正确),也可以从域和端点的有效性的角度来看待它(即,确保域存在并且唯一资源实际上是可访问的)。

在本文中,我们将从语法、域和端点有效性的角度讨论什么是有效的 URL,并且我们将学习如何调用同时验证所有这三个因素的 API(使用现成的 Java 代码示例)。

了解 URL 有效性

验证 URL 字符串首先要检查 URL 语法。必须正确合并 URL 结构的每个组件才能访问任何给定 URL 的资源。

让我们快速分解有效 URL 的基本组件。我们将举一个简单的例子。https://example.com

有效的 URL 以正确键入的方案开头,该方案标识用于通信的 Internet 协议。在 的情况下,该协议是 。方案后面必须跟方案分隔符,以将其与 URL 的其余部分分开。方案语法中的错误很常见,但使用轻量级编程方法相对容易识别。https://example.com``https``://

接下来,一个有效的 URL 会显示一个顶级域(例如 )和一个二级域(例如 )。子域(例如,)有时可以位于二级域之前。在此阶段,域语法错误可能涉及简单的拼写错误,例如 .和 之间缺少句点表示缺少顶级域,并且无法访问 URL。.com``example``api.example``https://examplecom``example ``com

语法至关重要,但仅验证语法并不能完全确保 URL 正常运行。拼写错误的域名可能在语法上看起来是正确的,但除非我们检查 DNS(域名系统)以查看它是否在那里注册,否则我们不会知道它是一个真正的域名。例如,如果我们将示例 URL 拼写错误为 ,我们将无法访问资源(除非还拥有域),但从技术上讲,我们将拥有语法上有效的 URL 字符串。https://exmpl.com``https://example.com``example.com``exmpl.com

此外,使用 DNS 查找验证域名也不一定意味着我们可以从该 URL 访问资源。具有注册域名的格式正确的 URL 仍可能指向由于某种原因无法访问的资源。例如,如果我们计划对 进行 API 调用,则需要直接向 URL 终结点发出请求,以确定它是否正在侦听并准备好按预期修改/返回资源。https://api.example.com

在 Java 中验证 URL

在 Java 中,有几种标准方法可以验证 URL。在本例中,我们将简要讨论可用于此目的的两个常见类:和 。这两个类都是包的一部分,该包由 Java 开发工具包 (JDK) 提供。java.net.url``HttpURLConnection``java.net

使用该类,我们可以在 URL 解析期间执行有限的验证检查。我们可以检查 URL 字符串中的语法错误,并且可以确保 URL 遵循标准格式。但是,此类主要不是为验证而设计的;相反,它旨在以其他重要方式处理 URL,例如解析或撰写 URL。我们将无法使用此类验证域名和终结点。java.net.url

使用该类,我们可以打开带有 URL 的连接,并检查来自底层服务器的响应代码。从技术上讲,这可以作为验证 URL 终结点的方法,但它有点占用资源(而且,与类非常相似,它在设计时没有明确考虑验证)。当我们使用该类时,我们需要我们的应用程序来处理连接设置、发送请求、读取响应和管理错误——所有这些都给我们的服务器带来了很大的负担。HttpURLConnection``java.net.url``HttpURLConnection

使用免费 API 全面验证 URL

与其围绕 Java 类构建 URL 验证工作流,不如利用免费的 URL 验证 API,它代表我们执行详尽的 URL 验证检查。

这样,我们可以在一个步骤中非常轻松地验证 URL 语法、域存在性和端点可用性。也许最重要的是,我们可以将域和端点验证中涉及的繁重工作抽象到另一台服务器上。我们的应用程序不需要自己处理 HTTP 连接管理或错误处理,而且 - 作为一个额外的好处 - 它也不需要直接处理具有潜在威胁的 URL。

如果我们使用此 API 来验证我们前面的示例,我们将得到以下响应:https://example.com

JSON的

{
  "ValidURL": true,
  "Valid_Syntax": true,
  "Valid_Domain": true,
  "Valid_Endpoint": true,
  "WellFormedURL": "https://example.com/"
}

使用像这样的简单响应对象,我们可以根据几个重要的 URL 验证类别快速确定 URL 是否可用。

示范

为了利用这个多步骤 URL 验证 API,我们可以使用下面提供的即用型 Java 代码示例来构建我们的 API 调用,并且可以使用免费的 API 密钥来授权我们的 API 调用。使用免费的 API 密钥,我们每月最多可以进行 800 次 API 调用,而无需任何额外承诺。

要安装客户端 SDK,让我们在 Maven POM 文件中添加以下对存储库的引用(Jitpack 用于动态编译库):

XML格式

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

然后,让我们添加以下对依赖项的引用:

XML格式

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

接下来,让我们将导入添加到我们的文件中:

爪哇岛

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.DomainApi;

之后,让我们使用下面的示例来调用 URL 验证函数,并将 “YOUR API KEY” 占位符文本替换为我们自己的 API 密钥:

爪哇岛

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

DomainApi apiInstance = new DomainApi();
ValidateUrlRequestFull request = new ValidateUrlRequestFull(); // ValidateUrlRequestFull | Input URL request
try {
    ValidateUrlResponseFull result = apiInstance.domainUrlFull(request);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling DomainApi#domainUrlFull");
    e.printStackTrace();
}

这就是我们需要的所有代码。现在,我们可以轻松地使用此 API 在任何 Java Web 应用程序中捕获 URL 输入字符串,并执行有用的多步骤验证检查。