2016-05-12 7 views
1

の設定春RestTemplate

RestTemplate restTemplate = new RestTemplate(); 
HttpHeaders headers = new HttpHeaders(); 

String plainCreds = "test:test2"; 
byte[] plainCredsBytes = plainCreds.getBytes(); 
String base64Creds = DatatypeConverter.printBase64Binary(plainCredsBytes); 
headers.add("Authorization", "Basic " + base64Creds); 
headers.add("Content-type","application/x-www-form-urlencoded;charset=utf-8"); 

headers.set("Accept", MediaType.APPLICATION_XML_VALUE); 
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl) 
    .queryParam("id", "id1234"); 
HttpEntity<String> entity = new HttpEntity<>(headers); 
ResponseEntity<String> response = restTemplate.exchange(
     builder.build().encode().toUri(), 
     HttpMethod.GET, entity, String.class); 

私はRestTemplateを得る代わりに、新たな使用のためのファクトリパターンを使用することはできthis-

  1. ため、次の疑問を持ってRESTサービスを呼び出す取得するための次のコードを持っています。それの長所と短所は何でしょうか。
  2. 現在、上記のコードでヘッダーに資格情報を追加しています。それを実現するための良い方法がいくつかあります(構成や、実動コードに適した方法など)。 RestTemplateの一般的な使用パターンは、あなたがそれを望むようにを設定し、througouhtそのすべてのアプリケーションを再利用することである

おかげ

+0

あなたはそのコードをどこかからコピーしましたが、使い方は分かりませんでしたか?たぶんあなたはその文書を読むべきです。 – Kayaman

+0

私のコードでそれを使用し、それは良い作品です。いくつかの場所からそれを得た。ドキュメンテーションを読む...しかし、まだ疑問が残っていた – Rehan

+0

文書を読んだ後で、疑問をすべて解決する必要があります。 – Kayaman

答えて

0
  1. 。それはthread safeですが、できるだけ少ない(理想的にはただ1つ)作成するように作成するのは高価な場合があり、それらを再利用することはあなたがすべきことです。

  2. あり、自動的にすべての要求に基本認証を追加するRestTemplateを設定する方法があるが、IMOそれは価値があるには余りにも複雑だ - あなたはHttp Componentscreate your own request factoryで少し周り混乱する必要があるので、私は最も簡単な解決策があると思います手作業のステップをヘルパークラスに分解するだけです。

-

public class RestTemplateUtils { 

    public static final RestTemplate template; 
    static { 
     // Init the RestTemplate here 
     template = new RestTemplate(); 
    } 

    /** 
    * Add basic authentication to some {@link HttpHeaders}. 
    * @param headers The headers to add authentication to 
    * @param username The username 
    * @param password The password 
    */ 
    public static HttpHeaders addBasicAuth(HttpHeaders headers, String username, String password) { 
     String plainCreds = username + ":" + password; 
     byte[] plainCredsBytes = plainCreds.getBytes(); 
     String base64Creds = DatatypeConverter.printBase64Binary(plainCredsBytes); 
     headers.add("Authorization", "Basic " + base64Creds); 
     return headers; 
    } 
} 

あなたのコードでは、今に変身:私はエンティティを作成し、他の標準ヘッダを追加するために、いくつかのより多くのヘルパーメソッドを追加することをお勧めしたいけど

HttpHeaders headers = RestTemplateUtils.addBasicAuth(new HttpHeaders(), 
     "test", "test"); 

headers.add("Content-type","application/x-www-form-urlencoded;charset=utf-8"); 
headers.set("Accept", MediaType.APPLICATION_XML_VALUE); 

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl) 
    .queryParam("id", "id1234"); 
HttpEntity<String> entity = new HttpEntity<>(headers); 
ResponseEntity<String> response = RestTemplateUtils.template.exchange(
     builder.build().encode().toUri(), 
     HttpMethod.GET, entity, String.class); 

それに。

+0

Ranizに感謝しました。 – Rehan

+0

@Raniz私は自分のプロジェクトの中で 'RestTemplate'も使っていますが、' RestTemplate'を使って '要求ごとにリクエストを設定する'方法を理解することはできません。私はあなたの質問[ここ](http://stackoverflow.com/questions/37125694/initialize-socket-timeout-value-in-httpclient-and-then-use-it-with-resttemplate/)を開いています。あなたが手伝ってくれるかどうかを知りたい。どんな助けでも大歓迎です。 – user1950349

関連する問題