统一资源定位符 (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.comhttps://
接下来,有效的 URL 会显示一个顶级域(例如,)和一个二级域(例如,)。子域(例如,)有时可以位于二级域之前。在此阶段,域语法错误可能涉及简单的拼写错误,例如 。如果 and 之间缺少句点,则表示缺少顶级域,并且无法访问 URL。.comexampleapi.examplehttps://examplecomexample com
语法至关重要,但仅验证语法并不能完全确保 URL 正常运行。拼写错误的域名在语法上可能看起来是正确的,但除非我们检查 DNS(域名系统)以查看它是否在那里注册,否则我们不会知道它是一个真正的域名。例如,如果我们将示例 URL 拼写错误为 ,我们将无法访问资源(除非也拥有该域),但从技术上讲,我们将有一个语法有效的 URL 字符串。https://exmpl.comhttps://example.comexample.comexmpl.com
此外,使用 DNS 查找验证域名并不一定意味着我们可以从该 URL 访问资源。具有已注册域名的格式正确的 URL 仍然可以指向由于某种原因而无法访问的资源。例如,如果我们计划对 进行 API 调用,则需要直接向 URL 端点发出请求,以确定它是否正在侦听并准备好按预期修改/返回资源。https://api.example.com
在 Java 中验证 URL
有几种标准方法可以在 Java 中验证 URL。在本例中,我们将简要讨论可用于此目的的两个常见类:、 和 。这两个类都是包的一部分,该包由 Java 开发工具包 (JDK) 提供。java.net.urlHttpURLConnectionjava.net
使用该类,我们可以在 URL 解析期间执行有限的验证检查。我们可以检查 URL 字符串中的语法错误,并且可以确保 URL 遵循标准格式。但是,此类主要不是为验证而设计的;相反,它旨在以其他重要方式处理 URL,例如解析或组合 URL。我们将无法使用此类验证域名和端点。java.net.url
使用该类,我们可以打开带有 URL 的连接,并检查底层服务器的响应代码。从技术上讲,这是一种验证 URL 端点的方法,但它有点耗费资源(而且,就像类一样,它没有明确地设计为考虑验证)。当我们使用这个类时,我们需要我们的应用程序来处理连接设置、发送请求、读取响应和管理错误——所有这些都给我们的服务器带来了沉重的负担。HttpURLConnectionjava.net.urlHttpURLConnection
使用免费 API 完全验证 URL
我们可以利用免费的 URL 验证 API,而不是围绕 Java 类构建 URL 验证工作流,该 API 代表我们执行详尽的 URL 验证检查。
这样,我们就可以非常轻松地一步验证 URL 语法、域存在性和端点可用性。也许最重要的是,我们可以将域和端点验证所涉及的繁重工作抽象到另一台服务器。我们的应用程序不需要自己处理 HTTP 连接管理或错误处理,而且 - 作为一个额外的好处 - 它也不需要直接处理可能具有威胁性的 URL。
如果我们使用此 API 来验证我们之前的示例,我们将获得以下响应:https://example.com
{ "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 用于动态编译库)中添加对仓库的以下引用:
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
然后,让我们向依赖项添加以下引用:
<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 输入字符串,并执行有用的多步骤验证检查。