2012-11-18 21 views
7

是否有Java獨立實現來提取URI-Template(RFC 6570)定義的URI中的參數值?用於提取URI模板(RFC 6570)中的值的獨立Java實現?

我發現最好的實現是一個Ruby實現(https://github.com/sporkmonger/addressable

通過http://code.google.com/p/uri-templates/wiki/Implementations我發現了一個Java實現:手持URI模板

它支持的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())); 
    } 
} 

另一個澤西島(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); 
} 
+0

你有沒有找到解決方案?我正在尋找完全相同的,但它看起來像我必須帶來我自己的實施... –

+0

你可能看看谷歌HTTP客戶端,它具有類似的功能。請參閱https://code.google.com/p/google-http-java-client/ – sappenin

回答

-5

java.net.URI

無法在實例化後設置參數,但它有一組很好的getter,您可以構造一個新的參數來改變它。

+0

這與https://tools.ietf.org/html/rfc6570中定義的URI模板無關 – deamon

0

damnhandy uri template library正好具有此功能open issue。我已經獲得了合併功能的PR,它應該在2.2版本中!去那邊,讓維護人員知道你有興趣。

此外,如果你不能等待,你可以看到我是怎麼做到的here並使用它。