在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