是否有 Java 独立实现来提取 URI 中由 URI-Template (RFC 6570) 定义的参数值?
我发现的最佳实现是 ruby 实现(https://github.com/sporkmonger/addressable)
通过http://code.google.com/p/uri-templates/wiki/Implementations我找到了一个 Java 实现:Handy-URI-Templates
它支持将带有参数值的 URI-Template 解析为最终 URI。不幸的是,它不能做相反的事情:根据 URI-Template 提取 URI 中的参数值。
JAX-RS(或 Restlet)的实现在内部具有此功能。但似乎没有人能够独立使用这个可以独立使用的功能模块。
有人有其他想法吗?
这是使用 spring-Web 的示例:
import org.springframework.web.util.UriTemplate;
public class UriParserSpringImpl implements UriParser {
private final UriTemplate uriTemplate;
private final String uriTemplateStr;
public UriParserSpringImpl(final String template) {
this.uriTemplateStr = template;
this.uriTemplate = new UriTemplate(template);
}
@Override
public Map<String, String> parse(final String uri) {
final boolean match = this.uriTemplate.matches(uri);
if (!match) {
return null;
}
return uriUtils.decodeParams(this.uriTemplate.match(uri));
}
@Override
public Set<String> getVariables() {
return Collections.unmodifiableSet(new LinkedHashSet<String>(this.uriTemplate.getVariableNames()));
}
}
另一个泽西岛(JAX-RS 实现):
import com.sun.jersey.api.uri.UriTemplate;
public class UriParserJerseyImpl implements UriParser {
private final UriTemplate uriTemplate;
private final Map<String, String> valuesMaps;
public UriParserJerseyImpl(final String template) {
this.uriTemplate = new UriTemplate(template);
final Map<String, String> valuesMaps = new HashMap<String, String>();
for (final String prop : this.uriTemplate.getTemplateVariables()) {
valuesMaps.put(prop, null);
}
this.valuesMaps = Collections.unmodifiableMap(valuesMaps);
}
@Override
public Map<String, String> parse(final String uri) {
final Map<String, String> values = new HashMap<String, String>(this.valuesMaps);
final boolean match = this.uriTemplate.match(uri, values);
if (!match) {
return null;
}
return values;
}
@Override
public Set<String> getVariables() {
return this.valuesMaps.keySet();
}
}
带接口:
public interface UriParser {
public Set<String> getVariables();
public Map<String, String> parse(final String uri);
}