用于在URI模板(RFC 6570)中提取值的独立Java实现?

JYC*_*JYC 10 java parsing jax-rs restlet uritemplate

是否有Java独立实现来提取URI中模板(RFC 6570)定义的参数值?

我发现的最佳实现是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()));
  }
}
Run Code Online (Sandbox Code Playgroud)

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

带接口:

public interface UriParser {
  public Set<String> getVariables();
  public Map<String, String> parse(final String uri);
}
Run Code Online (Sandbox Code Playgroud)

小智 -5

java.net.URI

实例化后无法设置参数,但它有一组很好的 getter,您可以构造一个新的 getter 来更改它。