是否有Java独立实现来提取由URI-Template(RFC 6570)定义的URI中的参数值?
我发现的最佳实现是ruby实现(https://github.com/sporkmonger/addressable)
通过http://code.google.com/p/uri-templates/wiki/Implementations我找到了一个Java实现:Handy-URI-Templates
它支持使用参数值解析URI模板到最终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()));
}
}
Jersey的另一个(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);
}
答案 0 :(得分:1)
damnhandy uri template library对此功能有open issue。我已经获得了合并功能的PR,它应该是2.2版本!到那边去,让维护者知道你有兴趣。
此外,如果你不能等待,你可以看看我是如何做到的here并自己使用它。
答案 1 :(得分:-5)
java.net.URI
在实例化后无法设置参数,但它有一组很好的getter,你可以构造一个新的参数来改变它。