2017-01-23 104 views
0

在我的項目中,我在客戶端應用程序中使用RestTempate來訪問現有服務。服務本身返回的有效URI模板列表,以及一個我試圖用看起來像RestTemplate URI模板語法

http://corpdomain.com/service{?idparam} 

在運行時,它應該擴展到像

http://corpdomain.com/service?idparam=12345 

問題是,RestTemplate的getForObject( )不知道如何處理「{?idparam}」表示法。如果我給它提供URI http://corpdomain.com/service?idparam={idparam},一切工作正常。但這不是服務器返回給我的URI模板。

你知道如何在模板中使用{?idparam}類型表示法處理RestTemplate.getForObject()嗎?

你知道是否有關於URI模板語法的任何文檔?

我目前正在瀏覽spring的java源代碼,最終應該能夠找出解決方案。但是,真正讓我感到困惑的是缺少文檔或第三方信息。

謝謝大家提前!

+0

好吧,看起來像我找出了發生了什麼。速記符號「http://corpdomain.com/service {?idparam}」不是來自任何Spring庫,而是使用Affordance庫(https://github.com/dschulten/hydra-java)構建的。但我仍不明白爲什麼Spring和Affordance都沒有試圖記錄他們正在使用的URI模板格式。 – Alexander

回答

0

我不熟悉那種語法。不過,我會定義一個BASE_SERVICE_URL,並使用UriComponentsBuilder來製作您的網址。這將是這個樣子

private static final String BASE_SERVICE_URL = "http://corpdomain.com/service" 

    public void doTheThing(String idParam) { 
    ... 
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) 
      .queryParam("idparam", idparam) 
    ... 
    HttpEntity<String> response = restTemplate.exchange(
     builder.build().encode().toUri(), 
     HttpMethod.GET, 
     entity, 
     String.class); 
    } 
+0

這種方法可行,但是,我的問題是我試圖不自己構建URI。我試圖依靠服務返回給我的模板,所以我的客戶不需要有知識來做'。queryParam(「idparam」,idparam)' – Alexander

+0

如果服務器返回一個非標準的語法,你將不得不在你的端做一些解析來將{?somequerystringvar}轉換成一些春天會理解的東西。我可能是錯的,但是我之前沒有看到過這種語法,它可能是我知道的所有標準。也許你可以實現一種方法,將URI中的{?queryparam}發生的所有事件發送到?queryparam = queryparamvalue語法 – ferahgo

+0

@ferahgo服務器返回[rfc6570級別4](https://tools.ietf.org/html /rfc6570#section-3.2.8)標準的uri模板。春天只能理解1級。 – dschulten

0

您可以通過URI變量

getForObject(String url, Class<T> responseType, Map<String,?> uriVariables) 

文檔getForObject方法的一部分:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

否則,您可以利用構建和擴展的方法UriComponentsBuilder如下:

 String url="http://localhost:8080/test?idparam={idparam}"; 
     RestTemplate restTemplate=new RestTemplate(); 
     Map<String,String> uriVariables=new HashMap<String,String>(); 
     uriVariables.put("idparam", "1234"); 
     UriComponents builder=UriComponentsBuilder.fromHttpUrl(url).buildAndExpand(uriVariables); 
     System.out.println(" url built "+builder.toUri()); 

輸出:

url built http://localhost:8080/test?idparam=1234 

在的情況下,查詢參數是因爲你不知道是要獲得通過什麼網址動態,你可以象下面這樣:

UriComponentsBuilder builder=UriComponentsBuilder.fromHttpUrl(url); 
    Map<String,String> uriVariables =builder.build().getQueryParams().toSingleValueMap(); 
    //set or get required query params 
    restTemplate.getForObject(url, String.class, uriVariables);