2012-11-18 8 views
7

Gibt es eine Java Standalone-Implementierung zum Extrahieren von Werten von Parametern in einem URI, wie von einem URI-Template (RFC 6570) definiert?Standalone-Java-Implementierung zum Extrahieren von Werten in URI-Vorlage (RFC 6570)?

Die beste Umsetzung ich gefunden habe, ist eine Ruby-Implementierung (https://github.com/sporkmonger/addressable)

Via http://code.google.com/p/uri-templates/wiki/Implementations ich eine Java-Implementierung gefunden: Handy-URI-Templates

Es unterstützt die Auflösung eines URI-Template mit dem Parameter Werte zu einem endgültigen URI. Leider kann es nicht umgekehrt werden: Extraktion von Parameterwerten im URI nach URI-Template.

Implementierungen der JAX-RS (oder Restlet) haben diese Funktion intern. Aber keiner scheint dieses Feature-Modul isoliert zu haben, das unabhängig verwendet werden könnte.

Hat jemand eine andere Idee?


Hier ein Beispiel feder Web zu verwenden:

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())); 
    } 
} 

Ein weiteres für Jersey (JAX-RS-Implementierung):

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(); 
    } 
} 

Mit Schnittstelle:

public interface UriParser { 
    public Set<String> getVariables(); 
    public Map<String, String> parse(final String uri); 
} 
+0

Haben Sie schon einmal eine Lösung gefunden? Ich bin auf der Suche nach genau das gleiche, aber es sieht so aus, als müsste ich meine eigene Implementierung mitbringen ... –

+0

Sie könnten sich vielleicht den Google http-Client ansehen, der ähnliche Funktionen hat. Siehe https://code.google.com/p/google-http-java-client/ – sappenin

Antwort

-5

java.net.URI

Die Parameter können nicht festgelegt werden, nachdem sie instanziiert wurde, aber sie hat einen netten Satz von Gettern und Sie können einen neuen konstruieren, um ihn zu ändern.

+0

Dies hat nichts mit URI-Vorlagen zu tun, wie sie in https://tools.ietf.org/html/rfc6570 definiert sind – deamon

0

Die damnhandy uri template library hat eine open issue für genau diese Funktion. Ich habe bereits die PR für das Feature zusammengeführt und es sollte in Version 2.2 rauskommen! Geh dorthin und lass die Betreuer wissen, dass du interessiert bist.

Auch wenn Sie nicht warten können, können Sie sehen, wie ich es here getan habe und das für sich selbst verwenden.

Verwandte Themen