Spring Boot 匹配 URL 工具类

引言

在开发 Web 应用时,特别是使用 Spring Boot 框架时,高效的 URL 匹配工具可以极大地提高开发效率。本篇文章将介绍一个简单的 URL 匹配工具类,帮助开发者快速识别和处理 URL 中的路径参数和查询参数。

目标

我们将实现一个名为 UrlMatcher 的工具类,该类能够匹配给定的 URL 模式,并提取路径参数和查询参数。这里我们设定的目标是创建一个支持类似 Flask 框架的路径匹配方式。

设计思路

我们首先需要定义类的结构,然后实现 URL 匹配的具体方法。工具类将包含:

  • 存储 URL 模式
  • 匹配 URL 的逻辑
  • 提取路径参数的功能
  • 提取查询参数的功能

以下是我们工具类的 UML 类图:

classDiagram
    class UrlMatcher {
        - String pattern
        - Map<String, String> pathParams
        - Map<String, String> queryParams
        + UrlMatcher(String pattern)
        + boolean matches(String url)
        + Map<String, String> extractPathParams(String url)
        + Map<String, String> extractQueryParams(String query)
    }

代码实现

接下来,我们将实现上述 UrlMatcher 类,代码如下所示:

import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlMatcher {
    private String pattern;
    private Map<String, String> pathParams;

    public UrlMatcher(String pattern) {
        this.pattern = pattern;
        this.pathParams = new HashMap<>();
    }

    public boolean matches(String url) {
        String regex = pattern.replaceAll("\\{(\\w+)\\}", "(?<$1>\\w+)");
        Pattern compiledPattern = Pattern.compile(regex);
        Matcher matcher = compiledPattern.matcher(url);
        if (matcher.matches()) {
            pathParams.clear();
            for (String key : matcher.groupNames()) {
                if (key != null) {
                    pathParams.put(key, matcher.group(key));
                }
            }
            return true;
        }
        return false;
    }

    public Map<String, String> getPathParams() {
        return pathParams;
    }

    public Map<String, String> extractQueryParams(String url) {
        Map<String, String> queryParams = new HashMap<>();
        try {
            String query = new URI(url).getQuery();
            if (query != null) {
                String[] pairs = query.split("&");
                for (String pair : pairs) {
                    String[] keyValue = pair.split("=");
                    if (keyValue.length > 1) {
                        queryParams.put(keyValue[0], keyValue[1]);
                    }
                }
            }
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return queryParams;
    }
}

解析代码

  1. 构造器: 接收 URL 模式(例如,/user/{id})并初始化路径参数。
  2. matches方法: 使用正则表达式匹配 URL。如果匹配成功,将提取出的路径参数存储在 pathParams 中。
  3. getPathParams方法: 返回提取后的路径参数。
  4. extractQueryParams方法: 从 URL 中提取查询参数并返回 Key-Value 映射。

使用示例

下面是如何使用 UrlMatcher 的示例代码:

public class UrlMatcherTest {
    public static void main(String[] args) {
        UrlMatcher matcher = new UrlMatcher("/user/{id}");

        // 测试 URL 匹配
        String testUrl = "/user/123";
        if (matcher.matches(testUrl)) {
            System.out.println("匹配成功,路径参数:" + matcher.getPathParams());
        } else {
            System.out.println("匹配失败");
        }

        // 测试查询参数
        String testQueryUrl = "/user/123?active=true&premium=false";
        Map<String, String> queryParams = matcher.extractQueryParams(testQueryUrl);
        System.out.println("查询参数:" + queryParams);
    }
}

示例解析

  1. 创建 UrlMatcher 实例并定义 pattern 为 /user/{id}
  2. 调用 matches 方法进行匹配,并在匹配成功时打印路径参数。
  3. 调用 extractQueryParams 方法提取并打印查询参数。

状态图

为了理解 UrlMatcher 的状态变化,我们可以使用状态图表示:

stateDiagram
    [*] --> 初始状态
    初始状态 --> 匹配中: matches()
    匹配中 --> 匹配成功: 匹配成功
    匹配中 --> 匹配失败: 匹配失败
    匹配成功 --> 获取参数: getPathParams()
    获取参数 --> [*]
    匹配失败 --> [*]

在这个状态图中,我们可以看到 UrlMatcher 初始化后会进入匹配中状态,并根据匹配结果进行状态转移。

结论

通过实现 UrlMatcher 类,我们能够轻松地进行 URL 模式匹配并提取路径和查询参数。这对构建 RESTful API 尤其重要。希望此次示例能够为你的开发过程提供帮助!如果有任何问题或改进建议,欢迎随时交流。