Configuration and usage of restTemplate of Springboot
- 2021-12-05 06:14:33
- OfStack
In the springboot project, RestTemplate can be directly injected or simply configured
Basic configuration
@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;
}
}
The following are advanced configuration and use
1 Scenario
In the development of java, http is used to connect and access the third-party network interface, and the commonly used connection tools are HttpClient and OKHttp.
These two kinds of connection tools are complicated to use, and novices are prone to problems. If you use the spring framework, you can use restTemplate to make http connection requests.
The default connection mode of restTemplate is HttpConnection in java, and you can use ClientHttpRequestFactory to specify different connection modes of HTTP.
2 Dependence
maven depends on the following:
<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 Configuration
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 Connection Manager
* @return
*/
@Bean
public HttpClientConnectionManager poolingHttpClientConnectionManager() {
/*// Registration http And https Request
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
// Maximum number of connections
poolingHttpClientConnectionManager.setMaxTotal(500);
// Same route concurrency (concurrency per host)
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
return poolingHttpClientConnectionManager;
}
/**
* HttpClient
* @param poolingHttpClientConnectionManager
* @return
*/
@Bean
public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
// Settings http Connection Manager
httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
/*// Set the number of retries
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/
// Set the default request header
/*List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("Connection", "Keep-Alive"));
httpClientBuilder.setDefaultHeaders(headers);*/
return httpClientBuilder.build();
}
/**
* Request connection pool configuration
* @param httpClient
* @return
*/
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
// httpClient Creator
clientHttpRequestFactory.setHttpClient(httpClient);
// Connection timeout / Milliseconds (connect to the server ( Successful handshake ) Time beyond throwing connect timeout )
clientHttpRequestFactory.setConnectTimeout(5 * 1000);
// Data read timeout (socketTimeout)/ Milliseconds (server returns data (response) Exceeds the time of throwing read timeout )
clientHttpRequestFactory.setReadTimeout(10 * 1000);
// The timeout time for connection pool to get the requested connection should not be too long, and must be set / Milliseconds (if you don't get an available connection after the time limit, you will throw org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool )
clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);
return clientHttpRequestFactory;
}
/**
* rest Template
* @return
*/
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
// boot Can be used in RestTemplateBuilder.build Create
RestTemplate restTemplate = new RestTemplate();
// Configure the request factory
restTemplate.setRequestFactory(clientHttpRequestFactory);
return restTemplate;
}
}
4 Use
The entity classes used are as follows:
@Data
@ToString
public class TempUser implements Serializable {
private String userName;
private Integer age;
}
4.1 GET Request
Background interface code:
@RequestMapping("getUser")
public TempUser getUser(TempUser form) {
TempUser tempUser = new TempUser();
tempUser.setUserName(form.getUserName());
tempUser.setAge(form.getAge());
return tempUser;
}
4.1. 1 Ordinary access
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName= Zhang 3&age=18", TempUser.class);
4.1. 2 Return to HTTP status
ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity("http://localhost:8080/cs-admin/rest/getUser?userName= Zhang 3&age=18", TempUser.class);
// Get the status object
HttpStatus httpStatus = responseEntity.getStatusCode();
// Get status code
int statusCodeValue = responseEntity.getStatusCodeValue();
// Get headers
HttpHeaders httpHeaders = responseEntity.getHeaders();
// Get body
TempUser result = responseEntity.getBody();
4.1. 3 Mapping request parameters
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", " Zhang 3");
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 Request
4.2. 1 Normal access
Background interface code:
RequestMapping("getPostUser")
public TempUser getPostUser(@RequestBody TempUser form) {
TempUser tempUser = new TempUser();
tempUser.setUserName(form.getUserName());
tempUser.setAge(form.getAge());
return tempUser;
}
(1) Common Access Interface
TempUser param = new TempUser();
param.setUserName(" Zhang 3");
param.setAge(18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", param, TempUser.class);
(2) With HEAD access interface
<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>
0
4.2. 2 Access without Requestor Body
Only method is post, and the mode of parameter transmission is still param of get
Background interface code:
<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>
1
Access method:
<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>
2
4.3 Upload File
Background interface code:
@RequestMapping("uploadFile")
public TempUser uploadFile(HttpServletRequest request, TempUser form) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
// Get file information
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;
}
Access method:
<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>
4