1. 程式人生 > >Springboot2(15)輕鬆搞定RestTemplate

Springboot2(15)輕鬆搞定RestTemplate

原始碼地址

文章目錄

新增依賴

 <dependency>
 	 <groupId>org.apache.httpcomponents</groupId>
	 <artifactId>httpclient</artifactId>
 </dependency>

程式碼中加入RestTemplate的配置類

建立RestClientConfig類,設定連線池大小、超時時間、重試機制等。配置如下:

@Configuration
public class RestClientConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(clientHttpRequestFactory());
        restTemplate.
setErrorHandler(new DefaultResponseErrorHandler()); return restTemplate; } @Bean public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() { try { HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); SSLContext sslContext =
new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build(); httpClientBuilder.setSSLContext(sslContext); HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslConnectionSocketFactory).build();// 註冊http和https請求 // 開始設定連線池 PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); poolingHttpClientConnectionManager.setMaxTotal(500); // 最大連線數500 poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); // 同路由併發數100 httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)); // 重試次數 HttpClient httpClient = httpClientBuilder.build(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); // httpClient連線配置 clientHttpRequestFactory.setConnectTimeout(20000); // 連線超時 clientHttpRequestFactory.setReadTimeout(30000); // 資料讀取超時時間 clientHttpRequestFactory.setConnectionRequestTimeout(20000); // 連線不夠用的等待時間 return clientHttpRequestFactory; } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { log.error("初始化HTTP連線池出錯", e); } return null; } }

傳送GET請求

// 1-getForObject()
String response = restTemplate.getForObject(url , String.class);
System.out.println(response);

// 2-getForEntity()
ResponseEntity<String> responseEntity1 = restTemplate.getForEntity(url, String.class);
HttpStatus statusCode = responseEntity1.getStatusCode();
HttpHeaders header = responseEntity1.getHeaders();
String response2 = responseEntity1.getBody();
System.out.println(response2);

// 3-exchange()
RequestEntity requestEntity = RequestEntity.get(new URI(url)).build();
ResponseEntity<String> responseEntity2 = restTemplate.exchange(requestEntity, String.class);
String response3 = responseEntity2.getBody();
System.out.println(response3);

傳送POST請求

// 1-postForObject()
User user1 = this.restTemplate.postForObject(uri, user, User.class);

// 2-postForEntity()
ResponseEntity<User> responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class);

// 3-exchange()
RequestEntity<User> requestEntity = RequestEntity.post(new URI(uri)).body(user);
ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);

設定HTTP Header

// 1-Content-Type
RequestEntity<User> requestEntity = RequestEntity
        .post(new URI(uri))
        .contentType(MediaType.APPLICATION_JSON)
        .body(user);

// 2-Accept
RequestEntity<User> requestEntity = RequestEntity
        .post(new URI(uri))
        .accept(MediaType.APPLICATION_JSON)
        .body(user);

// 3-Other
RequestEntity<User> requestEntity = RequestEntity
        .post(new URI(uri))
        .header("Authorization", "Basic " + base64Credentials)
        .body(user);

傳送檔案

@RequestMapping(value="/sendFile")
public String sendFile() throws URISyntaxException, IOException {
    MultiValueMap<String, Object> multiPartBody = new LinkedMultiValueMap<>();
    multiPartBody.add("file", new ClassPathResource("tmp/user.txt"));
    RequestEntity<MultiValueMap<String, Object>> requestEntity = RequestEntity
        .post(new URI("http://127.0.0.1:8080/upload1"))
        .contentType(MediaType.MULTIPART_FORM_DATA)
        .body(multiPartBody);
    ResponseEntity<String> response = restTemplate.exchange(requestEntity, String.class);
    return "sueecess";
}

下載檔案

/**
* 下載檔案
* @param response
* @throws URISyntaxException
* @throws IOException
*/
@RequestMapping(value="/receiveFile")
public void receiveFile(HttpServletResponse response) throws URISyntaxException, IOException {
    // 小檔案
    RequestEntity requestEntity = RequestEntity.get(
        new URI("http://127.0.0.1:8080/downLoad.html")).build();
    ResponseEntity<byte[]> responseEntity = restTemplate.exchange(requestEntity, byte[].class);
    byte[] downloadContent = responseEntity.getBody();
    response.reset();
    response.setHeader("Content-Disposition", "attachment; filename=\"myframe.html\"");
    response.addHeader("Content-Length", "" + downloadContent.length);
    response.setContentType("application/octet-stream; charset=UTF-8");
    IOUtils.write(downloadContent, response.getOutputStream());
}

/**
* 大檔案
* @param response
* @return
* @throws URISyntaxException
*/
@RequestMapping(value="/bigFile")
public String bigFile(HttpServletResponse response) throws URISyntaxException {
    //大檔案
    ResponseExtractor<ResponseEntity<File>> responseExtractor =
        new ResponseExtractor<ResponseEntity<File>>() {
        @Override
        public ResponseEntity<File> extractData(ClientHttpResponse response)
            throws IOException {
            File rcvFile = File.createTempFile("rcvFile", "zip");
            FileCopyUtils.copy(response.getBody(), new FileOutputStream(rcvFile));
            return ResponseEntity.status(response.getStatusCode()).
                headers(response.getHeaders()).body(rcvFile);
        }
    };
    RequestCallback requestCallback = new RequestCallback() {
        @Override
        public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException {

        }
    };
    ResponseEntity<File> fileBody = this.restTemplate.execute(
        new URI("http://127.0.0.1:8080/downLoad.html"),
        HttpMethod.GET,  requestCallback, responseExtractor);
    File file = fileBody.getBody();
    file.renameTo(new File("D:/Users/big.hmtl"));
    return "success";
}