[英]JAX-RS Path Matching
我想验证我的REST API的URL。 例如,我有此JAX-RS路径:
/users/{id : \\d+}
现在,我将在不启动服务器的情况下测试不同的URL
/users/1
>有效
/users/a
a->无效
有人知道现有的解决方案或可能性吗?
更新:
我创建了一种从路径注释获取正则表达式的方法。 但是,当字符{
, }
或:
处于意外位置时,可能会出现问题。
private String GetRegex(String patternPath) {
int indexOfOpen = patternPath.indexOf("{", 0);
if (indexOfOpen < 0) {
return patternPath;
} else {
int indexOfClose = patternPath.indexOf("}");
int indexOfRegexStart = patternPath.indexOf(":");
if (indexOfRegexStart < 0 || indexOfRegexStart > indexOfClose) {
patternPath = patternPath.substring(0, indexOfOpen) + ".*"
+ patternPath.substring(indexOfClose + 1, patternPath.length());
} else {
patternPath = patternPath.substring(0, indexOfOpen)
+ patternPath.substring(indexOfRegexStart + 1, indexOfClose).trim()
+ patternPath.substring(indexOfClose + 1, patternPath.length());
}
return GetRegex(patternPath);
}
}
测试:
String patternPath = "/users/{userid}/{userId2 : \\d+$}";
String methodPath = "/users/435345/435435";
String getRegex = GetRegex(patternPath);
Assert.assertEquals("/users/.*/\\d+$", getRegex);
Matcher matcher = Pattern.compile(getRegex).matcher(methodPath);
Assert.assertEquals(true, matcher.matches());
正则表达式\\d+$
匹配1到N个数字,并且字符串以它结尾。 例如,它与字符a
不匹配。
您可以执行类似的代码:
Matcher matcher = Pattern.compile("/users/\\d+$").matcher(string);
if (matcher.find()) {
...
}
我改进了方法。 我现在使用"/{"
搜索模板表达式,并使用"}/"
搜索模板表达式的末尾。
public String GetRegex(String patternPath) {
int indexOfOpen = patternPath.indexOf("/{");
if (indexOfOpen < 0) {
return patternPath;
} else {
int indexOfClose = patternPath.indexOf("}/");
if(indexOfClose < 0){
if(patternPath.substring(patternPath.length() - 1).equals("}")){
indexOfClose = patternPath.length() - 1;
}
else{
return patternPath;
}
}
int indexOfRegexStart = patternPath.indexOf(":", indexOfOpen);
if (indexOfRegexStart < 0 || indexOfRegexStart > indexOfClose) {
patternPath = patternPath.substring(0, indexOfOpen + 1) + ".*" + patternPath.substring(indexOfClose + 1, patternPath.length());
} else {
patternPath = patternPath.substring(0, indexOfOpen + 1)
+ patternPath.substring(indexOfRegexStart + 1, indexOfClose).trim()
+ patternPath.substring(indexOfClose + 1, patternPath.length());
}
return GetRegex(patternPath);
}
}
测试:
String itemPath = "/users/{userid}/{userId2 : \\d+:{$}/{userid3}/{userid4 : [:]}/{userId5}/{userId6 : [8]}";
String getRegex = GetRegex(itemPath);
Assert.assertEquals( "/users/.*/\\d+:{$/.*/[:]/.*/[8]", getRegex);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.