在springboot項目中,可以直接注入RestTemplate使用,也可進行簡單配置
基礎配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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開發中,使用http連接,訪問第三方網絡接口,通常使用的連接工具為HttpClient和OKHttp。
這兩種連接工具,使用起來比較復雜,新手容易出問題。如果使用spring框架,可以使用restTemplate來進行http連接請求。
restTemplate默認的連接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP連接方式。
2 依賴
maven依賴如下:
1
2
3
4
5
6
7
8
9
10
|
< 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 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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(); // 最大連接數 poolingHttpClientConnectionManager.setMaxTotal( 500 ); // 同路由并發數(每個主機的并發) poolingHttpClientConnectionManager.setDefaultMaxPerRoute( 100 ); return poolingHttpClientConnectionManager; } /** * HttpClient * @param poolingHttpClientConnectionManager * @return */ @Bean public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) { HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // 設置http連接管理器 httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); /*// 設置重試次數 httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/ // 設置默認請求頭 /*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創建器 clientHttpRequestFactory.setHttpClient(httpClient); // 連接超時時間/毫秒(連接上服務器(握手成功)的時間,超出拋出connect timeout) clientHttpRequestFactory.setConnectTimeout( 5 * 1000 ); // 數據讀取超時時間(socketTimeout)/毫秒(務器返回數據(response)的時間,超過拋出read timeout) clientHttpRequestFactory.setReadTimeout( 10 * 1000 ); // 連接池獲取請求連接的超時時間,不宜過長,必須設置/毫秒(超時間未拿到可用連接,會拋出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創建 RestTemplate restTemplate = new RestTemplate(); // 配置請求工廠 restTemplate.setRequestFactory(clientHttpRequestFactory); return restTemplate; } } |
4 使用
使用到的實體類如下:
1
2
3
4
5
6
|
@Data @ToString public class TempUser implements Serializable { private String userName; private Integer age; } |
4.1 GET請求
后臺接口代碼:
1
2
3
4
5
6
7
|
@RequestMapping ( "getUser" ) public TempUser getUser(TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; } |
4.1.1 普通訪問
1
|
TempUser result = restTemplate.getForObject( "http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18" , TempUser. class ); |
4.1.2 返回HTTP狀態
1
2
3
4
5
6
7
8
9
|
ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity( "http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18" , TempUser. class ); // 獲取狀態對象 HttpStatus httpStatus = responseEntity.getStatusCode(); // 獲取狀態碼 int statusCodeValue = responseEntity.getStatusCodeValue(); // 獲取headers HttpHeaders httpHeaders = responseEntity.getHeaders(); // 獲取body TempUser result = responseEntity.getBody(); |
4.1.3 映射請求參數
1
2
3
4
|
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 普通訪問
后臺接口代碼:
1
2
3
4
5
6
7
|
RequestMapping( "getPostUser" ) public TempUser getPostUser( @RequestBody TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; } |
(1)普通訪問接口
1
2
3
4
|
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訪問接口
1
2
3
4
5
6
7
8
9
10
11
|
// 請求頭信息 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf( "application/json;charset=UTF-8" )); //headers.add("headParam1", "headParamValue"); // 請求體內容 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方式
后臺接口代碼:
1
2
3
4
5
6
7
|
@RequestMapping ( "getPostUserNoBody" ) public TempUser getPostUserNoBody(TempUser form) { TempUser tempUser = new TempUser(); tempUser.setUserName(form.getUserName()); tempUser.setAge(form.getAge()); return tempUser; } |
訪問方式:
1
2
3
4
5
|
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 上傳文件
后臺接口代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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; } |
訪問方式:
1
2
3
4
5
6
7
8
9
10
11
12
|
// 文件 FileSystemResource file= new FileSystemResource( "D:\\Elasticsearch權威指南(中文版).pdf" ); // 設置請求內容 MultiValueMap<String, Object> param= new LinkedMultiValueMap<>(); param.add( "file" , file); // 其他參數 param.add( "userName" , "張三" ); param.add( "age" , 18 ); // 組裝請求信息 HttpEntity<MultiValueMap<String, Object>> httpEntity= new HttpEntity<>(param); // 發送請求 TempUser result = restTemplate.postForObject( "http://localhost:8080/cs-admin/rest/uploadFile" , httpEntity, TempUser. class ); |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_43702146/article/details/116567707