2012-11-18 6 views
7

Esiste un'implementazione standalone Java per estrarre i valori dei parametri in un URI definito da un modello di URI (RFC 6570)?Implementazione Java autonoma per l'estrazione di valori nel modello URI (RFC 6570)?

La migliore applicazione che ho trovato è un'implementazione rubino (https://github.com/sporkmonger/addressable)

Via http://code.google.com/p/uri-templates/wiki/Implementations ho trovato un'implementazione Java: Handy-uri-Templates

Esso supporta la risoluzione di un URI-modello con il parametro valori a un URI finale. Sfortunatamente, non può fare il contrario: estrazione dei valori dei parametri nell'URI secondo URI-Template.

Le imperfezioni di JAX-RS (o Restlet) hanno questa caratteristica internamente. Ma nessuno sembra aver isolato questo modulo funzionale che potrebbe essere utilizzato indipendentemente.

Qualcuno ha un'altra idea?


Ecco un esempio per utilizzare la primavera-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())); 
    } 
} 

altro per Jersey (JAX-RS di implementazione):

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

Con interfaccia:

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

Avete mai trovato una soluzione? Sto cercando esattamente lo stesso, ma sembra che devo portare la mia implementazione ... –

+0

Si potrebbe guardare il client http di Google, che ha funzionalità simili. Vedi https://code.google.com/p/google-http-java-client/ – sappenin

risposta

-5

java.net.URI

Impossibile impostare i parametri dopo l'istanza, ma ha un bel set di getter e puoi modificarne uno nuovo per modificarlo.

+0

Questo non ha nulla a che fare con i modelli URI come definito da https://tools.ietf.org/html/rfc6570 – deamon

0

Il damnhandy uri template library ha uno open issue esattamente per questa funzione. Ho già ottenuto il PR per la funzione unita e dovrebbe essere nella versione 2.2! Andate là e fate sapere ai manutentori che siete interessati.

Anche se non puoi aspettare, puoi vedere come l'ho fatto here e usarlo tu stesso.

Problemi correlati