我构建了一个 API,您可以在其中注册回调 URL。
URL 使用 Apache UrlValidator 进行验证类。
我现在必须添加一项功能,允许在配置的 URL 中添加占位符。
https:/foo.com/${placeholder1}/bar/${placeholder2}
这些占位符将使用 Apache StrSubstitutor 动态替换或类似的东西。
现在我的问题是,如何使用占位符验证 URL?
我想到了一个解决方案:
- 我用示例值替换了预期的占位符
- 然后我使用 Apache UrlValidator 验证 URL
此解决方案的问题是 Apache UrlValidator仅返回一个 boolean 值,因此错误消息将非常不明确。
除了创建自己的正则表达式之外,还有其他解决方案吗?
更新:以下评论中的讨论
允许的占位符数量是有限的。
将替换占位符的字符串的格式也是已知的。
第一个目标是能够检查最终包含占位符的给定 URL 在配置时是否有效。
第二个目标是,如果 URL 无效,则返回一条可理解的错误消息。
有多种错误情况:
- 网址中使用的占位符不在允许的占位符列表中
- 无论占位符如何,该网址均无效
最佳答案
对于最小的 URL 验证,您可以使用 java.net.URL
构造函数(它将与您的 https:/foo.com/${placeholder1}/bar/$ {placeholder2}
示例)。
根据docs ,它抛出:
MalformedURLException - if no protocol is specified, or an unknown protocol is found, or spec is null.
然后,您可以利用 URL
方法作为奖励,获取其中的部分内容,例如路径、协议(protocol)等。
我绝对建议不要使用正则表达式进行 URL 验证重新发明轮子。
请注意,java.net.URI
具有更严格的验证,并且按原样使用占位符会使您的示例失败。
编辑
正如所讨论的,由于您还需要验证占位符,因此您可能希望首先尝试填充它们,如果出现问题则快速失败,然后继续根据 java.net.URI 验证填充的 URL
,进行严格验证。
一般警告
您可能还想让您的生活更轻松,并利用现有框架,该框架允许您首先使用带注释的路径变量(例如 Spring
等),但这相当广泛讨论。
关于使用占位符进行 Java URL 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48546184/