Spring Boot中提取并验证API请求内所有URL的方法咨询
在Spring Boot中提取并验证嵌套结构的URL
嘿,我来帮你搞定这个问题!在Spring Boot里处理这类嵌套JSON里的URL提取和验证其实挺顺手的,我分步骤给你拆解清楚:
第一步:定义实体类映射请求JSON
首先得创建几个实体类来接收这个嵌套结构的请求,这样Spring Boot能自动帮你把JSON反序列化为Java对象:
import java.util.List; public class SiteRequest { private Site site; // 记得添加getter和setter方法 public static class Site { private String name; private String code; private UrlGroups url; private String description; private String status; // 记得添加getter和setter方法 public static class UrlGroups { private List<UrlItem> googleUrl; // Jackson会自动映射下划线命名的"google-url" private List<UrlItem> fbUrl; // 记得添加getter和setter方法 public static class UrlItem { private String url; // 记得添加getter和setter方法 } } } }
小提示:Jackson默认支持驼峰与下划线字段的自动映射,所以
google-url会自动匹配到googleUrl字段,不用额外配置。
第二步:提取所有嵌套的URL
有了实体类之后,就可以在服务层里遍历所有嵌套的URL列表,把它们统一收集起来:
import java.util.ArrayList; import java.util.List; @Service public class SiteService { public List<String> extractAllUrls(SiteRequest request) { List<String> allUrls = new ArrayList<>(); SiteRequest.Site.UrlGroups urlGroups = request.getSite().getUrl(); // 提取google-url下的所有URL if (urlGroups.getGoogleUrl() != null) { urlGroups.getGoogleUrl().forEach(item -> allUrls.add(item.getUrl())); } // 提取fb-url下的所有URL if (urlGroups.getFbUrl() != null) { urlGroups.getFbUrl().forEach(item -> allUrls.add(item.getUrl())); } return allUrls; } }
第三步:URL合法性验证
接下来要验证这些URL是否合法,这里给你两种常用方案:
方案1:Java原生URI类(无额外依赖)
这种方式不用引入第三方包,能做基础的格式验证:
public boolean isValidUrl(String url) { try { URI uri = new URI(url); // 确保是绝对URL且包含主机地址 return uri.isAbsolute() && uri.getHost() != null; } catch (URISyntaxException e) { return false; } }
方案2:Apache Commons Validator(更严谨)
如果需要更全面的规则校验(比如限制协议、检查域名格式),可以引入Apache的验证工具:
先在pom.xml添加依赖:
<dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>1.7</version> </dependency>
然后编写验证方法:
import org.apache.commons.validator.routines.UrlValidator; public boolean isValidUrl(String url) { // 只允许http和https协议 String[] allowedSchemes = {"http", "https"}; UrlValidator urlValidator = new UrlValidator(allowedSchemes); return urlValidator.isValid(url); }
可选:验证URL是否可访问
如果需要确保URL能正常连通,可以加一个网络检查(注意这会有网络开销,按需使用):
public boolean isUrlReachable(String url, int timeoutMs) { try { URL urlObj = new URL(url); HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); connection.setRequestMethod("HEAD"); connection.setConnectTimeout(timeoutMs); connection.setReadTimeout(timeoutMs); int responseCode = connection.getResponseCode(); // 2xx或3xx状态码都视为可访问 return responseCode >= 200 && responseCode < 400; } catch (IOException e) { return false; } }
第四步:整合业务流程存库
最后把提取和验证逻辑整合起来,在存入数据库前完成校验:
public void processAndSaveSite(SiteRequest request) { List<String> allUrls = extractAllUrls(request); // 逐个验证URL for (String url : allUrls) { if (!isValidUrl(url)) { throw new IllegalArgumentException("非法URL:" + url); } // 如果需要连通性检查,取消下面注释 // if (!isUrlReachable(url, 5000)) { // throw new IllegalArgumentException("URL无法访问:" + url); // } } // 这里编写存入数据库的逻辑,比如将请求转换为实体类后调用Repository保存 // siteRepository.save(convertToSiteEntity(request)); }
额外小技巧
- 如果JSON字段名和实体类字段名无法自动匹配,可以用
@JsonProperty注解手动指定,比如@JsonProperty("google-url")标注在googleUrl字段上。 - 可以把URL验证封装成自定义注解(比如
@ValidUrl),直接在实体类的url字段上标注,让校验更优雅。
内容的提问来源于stack exchange,提问作者Anandu Mohan
相关产品推荐
相关产品推荐

