Springboot之restTemplate的配置及使用方式
在springboot項目中,可以直接注入RestTemplate使用,也可進行簡單配置
基礎(chǔ)配置
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(150000); // ms factory.setConnectTimeout(150000); // ms return factory; } }
以下為進階配置和使用
1 場景
java開發(fā)中,使用http連接,訪問第三方網(wǎng)絡(luò)接口,通常使用的連接工具為HttpClient和OKHttp。
這兩種連接工具,使用起來比較復(fù)雜,新手容易出問題。如果使用spring框架,可以使用restTemplate來進行http連接請求。
restTemplate默認的連接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP連接方式。
2 依賴
maven依賴如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.7</version> </dependency>
3 配置
import org.apache.http.client.HttpClient; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { /** * http連接管理器 * @return */ @Bean public HttpClientConnectionManager poolingHttpClientConnectionManager() { /*// 注冊http和https請求 Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/ PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(); // 最大連接數(shù) poolingHttpClientConnectionManager.setMaxTotal(500); // 同路由并發(fā)數(shù)(每個主機的并發(fā)) poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); return poolingHttpClientConnectionManager; } /** * HttpClient * @param poolingHttpClientConnectionManager * @return */ @Bean public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) { HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // 設(shè)置http連接管理器 httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); /*// 設(shè)置重試次數(shù) httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/ // 設(shè)置默認請求頭 /*List<Header> headers = new ArrayList<>(); headers.add(new BasicHeader("Connection", "Keep-Alive")); httpClientBuilder.setDefaultHeaders(headers);*/ return httpClientBuilder.build(); } /** * 請求連接池配置 * @param httpClient * @return */ @Bean public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) { HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); // httpClient創(chuàng)建器 clientHttpRequestFactory.setHttpClient(httpClient); // 連接超時時間/毫秒(連接上服務(wù)器(握手成功)的時間,超出拋出connect timeout) clientHttpRequestFactory.setConnectTimeout(5 * 1000); // 數(shù)據(jù)讀取超時時間(socketTimeout)/毫秒(務(wù)器返回數(shù)據(jù)(response)的時間,超過拋出read timeout) clientHttpRequestFactory.setReadTimeout(10 * 1000); // 連接池獲取請求連接的超時時間,不宜過長,必須設(shè)置/毫秒(超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool) clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000); return clientHttpRequestFactory; } /** * rest模板 * @return */ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) { // boot中可使用RestTemplateBuilder.build創(chuàng)建 RestTemplate restTemplate = new RestTemplate(); // 配置請求工廠 restTemplate.setRequestFactory(clientHttpRequestFactory); return restTemplate; } }
4 使用
使用到的實體類如下:
@Data @ToString public class TempUser implements Serializable { private String userName; private Integer age; }
4.1 GET請求
后臺接口代碼:
@RequestMapping("getUser") public TempUser getUser(TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; }
4.1.1 普通訪問
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18", TempUser.class);
4.1.2 返回HTTP狀態(tài)
ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity("http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18", TempUser.class); // 獲取狀態(tài)對象 HttpStatus httpStatus = responseEntity.getStatusCode(); // 獲取狀態(tài)碼 int statusCodeValue = responseEntity.getStatusCodeValue(); // 獲取headers HttpHeaders httpHeaders = responseEntity.getHeaders(); // 獲取body TempUser result = responseEntity.getBody();
4.1.3 映射請求參數(shù)
Map<String, Object> paramMap = new HashMap<>(); paramMap.put("userName", "張三"); paramMap.put("age", 18); TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName={userName}&age={age}", TempUser.class, paramMap);
4.2 POST請求
4.2.1 普通訪問
后臺接口代碼:
RequestMapping("getPostUser") public TempUser getPostUser(@RequestBody TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; }
(1)普通訪問接口
TempUser param = new TempUser(); param.setUserName("張三"); param.setAge(18); TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", param, TempUser.class);
(2)帶HEAD訪問接口
// 請求頭信息 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf("application/json;charset=UTF-8")); //headers.add("headParam1", "headParamValue"); // 請求體內(nèi)容 TempUser param = new TempUser(); param.setUserName("張三"); param.setAge(18); // 組裝請求信息 HttpEntity<TempUser> httpEntity=new HttpEntity<>(param,headers); TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", httpEntity, TempUser.class);
4.2.2 無請求體的訪問
僅method為post,傳參方式仍然為get的param方式
后臺接口代碼:
@RequestMapping("getPostUserNoBody") public TempUser getPostUserNoBody(TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; }
訪問方式:
Map<String, Object> paramMap = new HashMap<>(); paramMap.put("userName", "張三"); paramMap.put("age", 18); TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUserNoBody?userName={userName}&age={age}", null, TempUser.class, paramMap); System.out.println(result);
4.3 上傳文件
后臺接口代碼:
@RequestMapping("uploadFile") public TempUser uploadFile(HttpServletRequest request, TempUser form) { MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; //獲取文件信息 MultipartFile multipartFile = multipartHttpServletRequest.getFile("file"); TempUser tempUser = new TempUser(); if (multipartFile != null) { tempUser.setUserName(form.getUserName()+" "+multipartFile.getOriginalFilename()); } if(form!=null){ tempUser.setAge(form.getAge()); } return tempUser; }
訪問方式:
// 文件 FileSystemResource file=new FileSystemResource("D:\\Elasticsearch權(quán)威指南(中文版).pdf"); // 設(shè)置請求內(nèi)容 MultiValueMap<String, Object> param=new LinkedMultiValueMap<>(); param.add("file", file); // 其他參數(shù) param.add("userName", "張三"); param.add("age", 18); // 組裝請求信息 HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param); // 發(fā)送請求 TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/uploadFile", httpEntity, TempUser.class);
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?web開發(fā)教程之Request獲取3種方式
這篇文章主要給大家介紹了關(guān)于Spring?web開發(fā)教程之Request獲取3種方式的相關(guān)資料,request對象是從客戶端向服務(wù)器發(fā)出請求,包括用戶提交的信息以及客戶端的一些信息,需要的朋友可以參考下2023-11-11SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解
在Java微服務(wù)越來越火的今天。幾乎什么公司都在搞微服務(wù)。而使用的比較多的就是Spring?Cloud技術(shù)棧。今天就來研究一下Spring?Cloud中服務(wù)發(fā)現(xiàn)與調(diào)用的基本原理2022-07-07Json字符串轉(zhuǎn)Java對象和List代碼實例
這篇文章主要介紹了Json字符串轉(zhuǎn)Java對象和List代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼
這篇文章主要介紹了Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02shiro與spring集成基礎(chǔ)Hello案例詳解
這篇文章主要介紹了shiro與spring集成基礎(chǔ)Hello案例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11MyBatis入門學(xué)習(xí)教程-MyBatis快速入門
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis的一篇快速入門教程2021-06-06