10

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

2 回答 2

1

该死的uri 模板库有一个针对此功能的未解决问题。我已经获得了合并功能的 PR,它应该在 2.2 版中发布!去那里,让维护人员知道你感兴趣。

此外,如果您等不及,您可以在这里查看我是如何做到的,并为自己使用它。

于 2016-12-17T20:23:30.673 回答
-5

java.net.URI

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

于 2015-04-03T15:05:15.377 回答