You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:46:52