RestTemplateのカスタム構成と使用

26719 ワード

RestTemplateのカスタム構成と使用
  • 前言
  • バージョン
  • 工事構造
  • config
  • RestTemplate
  • RestOperations
  • InterceptingHttpAccessor
  • ClientHttpRequestFactory
  • 試行
  • 継続
  • まとめ
  • 前言
    RestTemplateは最もよく使われるSpringコンポーネントの1つであり、送信要求をカプセル化する多くの方法があり、簡単で優雅な実装コードhttpインタラクション本稿ではRestTemplateの使用と構成を例に挙げ、関連するブログ(リンク文で放出)と一部のソースコードを参照して構成を解読する.
    バージョン#バージョン#
    本明細書のサンプルエンジニアリングバージョンSpringBoot 2.0.8.RELEASE
    エンジニアリング構造
    RestTemplate的自定义配置及使用_第1张图片
    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がどのような実装クラスRestTemplate的自定义配置及使用_第2张图片を持っているかを簡単に見てみましょう.さまざまなクラス名に基づいて、一般的な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