【问题标题】:Java Url Validation With Placeholders使用占位符进行 Java 网址验证
【发布时间】:2018-01-31 15:50:17
【问题描述】:

我已经构建了一个 API,您可以在其中注册回调 URL。

使用 Apache UrlValidator 类验证 URL。

我现在必须添加一个允许在配置的 URL 中添加占位符的功能。

https:/foo.com/${placeholder1}/bar/${placeholder2}

这些占位符将使用 Apache StrSubstitutor 或类似名称动态替换。

现在我的问题是,如何使用占位符验证 URL?

我已经想到了一个解决方案:

  • 我将预期的占位符替换为示例值
  • 然后我使用 Apache UrlValidator 验证 URL

我对这个解决方案的问题是 Apache UrlValidator 只返回一个布尔值,所以错误消息会很模糊。

除了创建我自己的正则表达式之外,还有其他解决方案吗?

更新:关注 cmets 中的讨论

允许的占位符数量有限。

替换占位符的字符串格式也是已知的。

第一个目标是能够检查最终包含占位符的给定 URL 在配置时是否有效。

第二个目标是,如果 URL 无效,则返回可理解的错误消息。

有多种错误情况:

  • URL 中使用的占位符不在允许的占位符列表中
  • 独立于占位符的 URL 无效

【问题讨论】:

  • 什么时候你要验证:在替换之前还是之后?
  • 替换前,回调配置创建时。占位符是已知的,我可以做一个样本替换。
  • 您要单独清理替换字符串吗?假设你有一个好的骨架,然后使用 ":::::" 之类的东西作为替代品?
  • 替换字符串已经被指定和清理(序列号和ID...)。
  • 这是https:/foo.com/ 一个有效的网址吗?另外,您希望占位符在 url 中的什么位置?

标签: java regex validation url


【解决方案1】:

对于最小的 URL 验证,您可以使用 java.net.URL 构造函数(它将与您的 https:/foo.com/${placeholder1}/bar/${placeholder2} 示例一起使用)。

根据docs,它抛出:

MalformedURLException - 如果未指定协议,或发现未知协议,或规范为空。

然后,您可以利用 URL 方法作为奖励,获取其中的一部分,例如路径、协议等。

我绝对建议不要使用正则表达式重新发明轮子来进行 URL 验证。

请注意,java.net.URI 具有更严格的验证,并且会按原样使用占位符使您的示例失败。

编辑

如前所述,由于您还需要验证占位符,因此您可能希望先尝试填充它们,如果出现问题则快速失败,然后继续并针对 java.net.URI 验证填充的 URL,以进行严格验证。

一般警告

您可能还希望让您的生活更轻松,并利用一个允许您首先使用带注释的路径变量的现有框架(例如Spring 等),但这是一个相当广泛的讨论。

【讨论】:

  • 我应该补充说有一个“允许”占位符列表,我想检查是否只使用了那些。
  • @A.Malle 你最初是通过配置UrlValidator来做到这一点的吗?
  • 占位符处理是新功能的一部分。目前,该 URL 不允许使用任何占位符。
  • @A.Malle 对,所以您可以使用URL 作为基础,然后正则表达式验证在${} 之间找到的任何内容(不情愿地匹配),针对一组接受的占位符。当然,如果有可能存在“格式错误”的占位符等,事情会变得更加复杂。或者,您可以尝试使用StrSubstitutor 填充,如果发生错误则快速失败,否则使用更严格的URI 验证最终结果。
  • 但是,如果我使用java.net.url 对占位符进行验证,那么我只需使用正则表达式检查占位符...这可能不会太难看?
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2017-09-21
  • 2011-05-23
  • 2012-04-02
  • 2013-01-15
  • 2017-08-03
相关资源
最近更新 更多