跳转至

54 RESTful Web Services(18):如何实现UriTemplate的主要功能?

你好,我是徐昊。今天我们继续使用TDD的方式实现RESTful Web Services。

回顾架构愿景与任务列表

目前我们已经实现了ResourceRouter,整体的架构愿景如下:



目前UriTemplate的任务列表为

  • UriTemplate

  • 匹配无参数的Uri模版

    • 如果Uri可以与模版匹配,则返回匹配结果
    • 如果Uri不能与模版匹配,则返回Optional.empty
    • 匹配带参数的Uri模版

    • 如果Uri可以与模版匹配,按照指定参数从Uri中提取值

    • 参数可以通过正则表达式指定格式
    • 如果参数重复定义,则抛出异常
    • 模版匹配的结果可以比较大小

    • 如果匹配的非参字符多,则优先(长的优先)

    • 如果匹配的非参数字符一样,匹配的分组多,则优先(参数优先)
    • 如果匹配的分组一样多,指定格式参数匹配多的优先(指定格式参数优先)

代码为:

class UriTemplateString implements UriTemplate {
    private static Pattern variable = Pattern.compile("\\{\\w[\\w\\.-]*\\}");
    private final Pattern pattern;
    public UriTemplateString(String template) {
        pattern = Pattern.compile("(" + variable(template) + ")" + "(/.*)?");
    }
    private String variable(String template) {
        return variable.matcher(template).replaceAll("([^/]+?)");
    }
    @Override
    public Optional<MatchResult> match(String path) {
        Matcher matcher = pattern.matcher(path);
        if (!matcher.matches()) return Optional.empty();
        int count = matcher.groupCount();
        return Optional.of(new MatchResult() {
            @Override
            public int compareTo(MatchResult o) {
                return 0;
            }
            @Override
            public String getMatched() {
                return matcher.group(1);
            }
            @Override
            public String getRemaining() {
                return matcher.group(count);
            }
            @Override
            public Map<String, String> getMatchedPathParameters() {
                return null;
            }
        });
    }
}

视频演示

进入今天的环节:

思考题

匹配结果按匹配的字符常量数、匹配的变量数、匹配的自定义变量数排序,如何寻找匹配结果排序的测试案例?

欢迎把你的想法分享在留言区,也欢迎把你的项目代码分享出来。相信经过你的思考与实操,学习效果会更好!

精选留言(1)
  • aoe 👍(0) 💬(0)

    group方法加了之后代码确实好理解多了

    2022-07-22