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

时间:2012-11-18 23:48:52

标签: java parsing jax-rs restlet uritemplate

是否有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);
}

2 个答案:

答案 0 :(得分:1)

damnhandy uri template library对此功能有open issue。我已经获得了合并功能的PR,它应该是2.2版本!到那边去,让维护者知道你有兴趣。

此外,如果你不能等待,你可以看看我是如何做到的here并自己使用它。

答案 1 :(得分:-5)

java.net.URI

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