2017-01-23 13 views
0

私のプロジェクトでは、既存のサービスにアクセスするためにクライアントアプリケーションでRestTempateを使用しています。サービス自体は有効なURIテンプレートのリストを返し、私は実行時にRestTemplate URIテンプレートの構文

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

のようなルックスを使用しようとしている1

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

問題は、RestTemplateのgetForObject(あるように、それが何かに展開する必要があります)は "{?idparam}"表記法をどうしたらいいのかわかりません。 URI http://corpdomain.com/service?idparam={idparam}をフィードすると、すべて正常に動作します。しかし、これはサーバーが私に返すURIテンプレートではありません。

テンプレートの{?idparam}型表記を使用してRestTemplate.getForObject()を動作させる方法を知っていますか?

URIテンプレートの構文に関するドキュメントがありますか?

私は現在、春のJavaソースを使っていますが、最終的には解決策を見つけ出すことができます。しかし、本当に私に不愉快なのは、文書や第三者の情報が不足していることです。

ありがとうございました!

+0

私は何が起こっているのか分かりました。簡略表記 'http://corpdomain.com/service {?idparam}'はSpringライブラリーからは来ていませんが、Affordanceライブラリ(https://github.com/dschulten/hydra-java)を使って構築されています。しかし、SpringやAffordanceが、彼らが使用しているURIテンプレート形式を文書化しようとした理由はまだ分かりません。 – Alexander

答えて

0

私はその構文に精通していません。しかし、私はBASE_SERVICE_URLを定義し、UriComponentsBuilderでそれを使用してURLを作成します。 http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

または他のビルドを利用すると方法を拡張することができます:それはあなたがgetForObject方法の一部

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

ドキュメントとしてURI変数を渡すことができますいずれかのこの

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テンプレート。 Springはレベル1しか理解していません。 – dschulten

0

のようになります。 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 

、クエリのparamsを使用すると、以下のように行うことができます、あなたが渡されるために何が起こっているか、URLがわからないような動的です:サービスはRFC 6570 URIテンプレートを返すよう

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); 
関連する問題