RestTemplateのカスタム構成と使用
26719 ワード
RestTemplateのカスタム構成と使用前言 バージョン 工事構造 config RestTemplate RestOperations InterceptingHttpAccessor ClientHttpRequestFactory 試行 継続 まとめ 前言
RestTemplateは最もよく使われるSpringコンポーネントの1つであり、送信要求をカプセル化する多くの方法があり、簡単で優雅な実装コードhttpインタラクション本稿ではRestTemplateの使用と構成を例に挙げ、関連するブログ(リンク文で放出)と一部のソースコードを参照して構成を解読する.
バージョン#バージョン#
本明細書のサンプルエンジニアリングバージョンSpringBoot 2.0.8.RELEASE
エンジニアリング構造
config
まず、最も簡単な例として、RestTemplate(SpringBoot 2の注入後に手動で注入する必要があるようですが、以前は使わず、具体的なバージョンは深く研究しません)を行います.
テスト
優雅なhttpリクエストのインタラクションが実現しました
RestTemplate
一般的に、上記のRestTemplateはhttpリクエストを処理するのに十分ですが、実際のビジネスでは、リクエストタイムアウト時間などのパラメータをカスタマイズする必要があります.リードタイムアウト時間?最下位httpクライアント?私たちは簡単な康康のソースコードです.
RestTemplateはInterceptingHttpAccessorを継承し、RestOperationsインタフェースを実現する
RestOperations
RestOperationsインタフェース名知意、rest操作インタフェースは、我々がよく知っているすべての要求方法を定義しています.例えば、
getForObject
postForObject
など、具体的な方法をご紹介します.このブログRestTemplateの使用と原理を参考にして、あなたは胸に熟していますか?
InterceptingHttpAccessor
クラスをHttpAccessorにドリルダウン
このインタフェースの方法は多くない
我々は
デフォルトのRestTemplateのClientHttpRequestFactoryはSimpleClientHttpRequestFactory
このメソッドは、ClientHttpRequestFactoryでは構成をカスタマイズできますが、ClientHttpRequestFactoryクラスには1つのメソッドしかありません.
ソースコードのデフォルトのcreateRequestは
つまりSimpleClientHttpRequestFactory.createRequest、コードは次のとおりです.
HttpクライアントはJDKに内蔵されたHttpURLConnectionであり、SimpleClientHttpRequestFactoryクラスでは次のような方法が見られます.
これを見ると、接続タイムアウト時間、読み出しタイムアウト時間、Httpクライアントなど、setの異なるClientHttpRequestFactoryでカスタマイズできる構成について説明しました.
ClientHttpRequestFactory
次に、ClientHttpRequestFactoryがどのような実装クラスを持っているかを簡単に見てみましょう.さまざまなクラス名に基づいて、一般的なMockMvcClientHttpRequestFactory OkHttpクライアントのOkHttp 3 ClientHttpRequestFactoryを簡単に推測することができます.HttpClientクライアントのH t p C o m p o n t s ClientHttpRequestFactory(クライアントごとに個別の依存を導入する必要がある)など、より詳細な実装クラスの紹介点ここでは
試す
現在の理解でHttpClient依存を導入するように構成しようとします
RestTemplate構成を変更します.ここではbuilderモードは使用しません.
テスト
コントロールコードに対応して、2秒の読み取り遅延を追加します.
結果読み出しタイムアウト、説明構成有効~
続行
最初の構成に戻ります
ここでは明らかにコンストラクタモードが使用されているので、より優雅に構成することができます.
まとめ
ここでは、RestTemplateとその構成について簡単に説明します.さまざまなビジネスニーズについて、対応する構成クラス、カスタム構成をさらに理解することができます.
ソースアドレスhttps://github.com/dangzhicairang/my-cloud.git
RestTemplateは最もよく使われるSpringコンポーネントの1つであり、送信要求をカプセル化する多くの方法があり、簡単で優雅な実装コードhttpインタラクション本稿ではRestTemplateの使用と構成を例に挙げ、関連するブログ(リンク文で放出)と一部のソースコードを参照して構成を解読する.
バージョン#バージョン#
本明細書のサンプルエンジニアリングバージョンSpringBoot 2.0.8.RELEASE
エンジニアリング構造
config
まず、最も簡単な例として、RestTemplate(SpringBoot 2の注入後に手動で注入する必要があるようですが、以前は使わず、具体的なバージョンは深く研究しません)を行います.
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
テスト
@Test
public void test1() {
Object obj = restTemplate.getForObject(
"https://www.baidu.com"
, String.class);
System.out.println(obj);
}
優雅なhttpリクエストのインタラクションが実現しました
RestTemplate
一般的に、上記のRestTemplateはhttpリクエストを処理するのに十分ですが、実際のビジネスでは、リクエストタイムアウト時間などのパラメータをカスタマイズする必要があります.リードタイムアウト時間?最下位httpクライアント?私たちは簡単な康康のソースコードです.
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations
RestTemplateはInterceptingHttpAccessorを継承し、RestOperationsインタフェースを実現する
RestOperations
RestOperationsインタフェース名知意、rest操作インタフェースは、我々がよく知っているすべての要求方法を定義しています.例えば、
getForObject
<T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException;
postForObject
<T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;
など、具体的な方法をご紹介します.このブログRestTemplateの使用と原理を参考にして、あなたは胸に熟していますか?
InterceptingHttpAccessor
public abstract class InterceptingHttpAccessor extends HttpAccessor
クラスをHttpAccessorにドリルダウン
public abstract class HttpAccessor {
protected final Log logger = LogFactory.getLog(getClass());
private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
public void setRequestFactory(ClientHttpRequestFactory requestFactory) {
Assert.notNull(requestFactory, "ClientHttpRequestFactory must not be null");
this.requestFactory = requestFactory;
}
public ClientHttpRequestFactory getRequestFactory() {
return this.requestFactory;
}
protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
ClientHttpRequest request = getRequestFactory().createRequest(url, method);
if (logger.isDebugEnabled()) {
logger.debug("Created " + method.name() + " request for \"" + url + "\"");
}
return request;
}
}
このインタフェースの方法は多くない
我々は
private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
デフォルトのRestTemplateのClientHttpRequestFactoryはSimpleClientHttpRequestFactory
public void setRequestFactory(ClientHttpRequestFactory requestFactory)
このメソッドは、ClientHttpRequestFactoryでは構成をカスタマイズできますが、ClientHttpRequestFactoryクラスには1つのメソッドしかありません.
ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException;
ソースコードのデフォルトのcreateRequestは
protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
ClientHttpRequest request = getRequestFactory().createRequest(url, method);
if (logger.isDebugEnabled()) {
logger.debug("Created " + method.name() + " request for \"" + url + "\"");
}
return request;
}
つまりSimpleClientHttpRequestFactory.createRequest、コードは次のとおりです.
@Override
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
HttpURLConnection connection = openConnection(uri.toURL(), this.proxy);
prepareConnection(connection, httpMethod.name());
if (this.bufferRequestBody) {
return new SimpleBufferingClientHttpRequest(connection, this.outputStreaming);
}
else {
return new SimpleStreamingClientHttpRequest(connection, this.chunkSize, this.outputStreaming);
}
}
HttpクライアントはJDKに内蔵されたHttpURLConnectionであり、SimpleClientHttpRequestFactoryクラスでは次のような方法が見られます.
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
これを見ると、接続タイムアウト時間、読み出しタイムアウト時間、Httpクライアントなど、setの異なるClientHttpRequestFactoryでカスタマイズできる構成について説明しました.
ClientHttpRequestFactory
次に、ClientHttpRequestFactoryがどのような実装クラスを持っているかを簡単に見てみましょう.さまざまなクラス名に基づいて、一般的なMockMvcClientHttpRequestFactory OkHttpクライアントのOkHttp 3 ClientHttpRequestFactoryを簡単に推測することができます.HttpClientクライアントのH t p C o m p o n t s ClientHttpRequestFactory(クライアントごとに個別の依存を導入する必要がある)など、より詳細な実装クラスの紹介点ここでは
試す
現在の理解でHttpClient依存を導入するように構成しようとします
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
RestTemplate構成を変更します.ここではbuilderモードは使用しません.
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory
= new HttpComponentsClientHttpRequestFactory();
httpComponentsClientHttpRequestFactory.setConnectTimeout(1000);
httpComponentsClientHttpRequestFactory.setReadTimeout(1000);
restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory);
return restTemplate;
}
テスト
@Test
public void test2() {
Object obj = restTemplate.getForObject(
"http://localhost:10601/test?name=dd"
, String.class);
System.out.println(obj);
}
コントロールコードに対応して、2秒の読み取り遅延を追加します.
@GetMapping(value = "/test")
public String test(@RequestParam(name = "name") String name) throws InterruptedException {
TimeUnit.SECONDS.sleep(2);
return "hello " + name;
}
結果読み出しタイムアウト、説明構成有効~
続行
最初の構成に戻ります
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
ここでは明らかにコンストラクタモードが使用されているので、より優雅に構成することができます.
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.requestFactory(HttpComponentsClientHttpRequestFactory.class)
.setConnectTimeout(1000)
.setReadTimeout(1000)
.build();
}
まとめ
ここでは、RestTemplateとその構成について簡単に説明します.さまざまなビジネスニーズについて、対応する構成クラス、カスタム構成をさらに理解することができます.
ソースアドレスhttps://github.com/dangzhicairang/my-cloud.git