RestTemplate是Spring框架中的一个类,用于简化发起HTTP请求和处理HTTP响应。它提供了一个高级API,用于与RESTful Web服务进行交互,将创建和配置HTTP连接的复杂性抽象化。
构造方式有两种:
- 无法控制超时时间等配置。
RestTemplate template = new RestTemplate();
2.可以通过参数控制配置。
RestTemplate template = new RestTemplate(ClientHttpRequestFactory requestFactory);
ClientHttpRequestFactory接口有4个实现类:
- SimpleClientHttpRequestFactory:接口的一个简单实现,可配置proxy,connectTimeout,readTimeout等参数。
- HttpComponentsClientHttpRequestFactory :允许用户配置带有认证和http连接池的httpclient。
- AbstractClientHttpRequestFactoryWrapper :用来装配其他request factory的抽象类。
- CommonsClientHttpRequestFactory :同2,已弃用。
使用步骤
1、创建配置类(这里也可以不创建,使用最基本的直接new RestTemplate())
RestTemplateConfig配置类
@Configuration
public class RestTemplateTestConfig {
public static SimpleClientHttpRequestFactory getSimpleFactory() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(1000);
requestFactory.setReadTimeout(1000);
return requestFactory;
}
public static HttpComponentsClientHttpRequestFactory getHttpComFactory()
throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
// 信任策略
TrustStrategy trustStrategy = (x509Certificates, s) -> true;
// 信任所有服务端的SSL证书
SSLContext sslContext = SSLContexts
.custom()
// 配置信任策略
.loadTrustMaterial(trustStrategy)
.build();
// 创建主机名验证器
NoopHostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
// 创建套接字工厂
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
RequestConfig config = RequestConfig .custom()
.setConnectTimeout(1000)
.setConnectionRequestTimeout(1000)
.setSocketTimeout(1000)
.build();
CloseableHttpClient httpClient = HttpClientBuilder .create()
.setDefaultRequestConfig(config)
.setSSLSocketFactory(socketFactory)
.build();
return new HttpComponentsClientHttpRequestFactory(httpClient);
}
}
2、发送请求
- 无参GET请求
// url
String url = "http://localhost:8300/*/*/*/getStrTwo";
//方式1、getForEntity
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String body = responseEntity.getBody();
//方式2、exchange
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.GET,null,String.class);
//方式3、getForObject
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
String object = restTemplate.getForObject(uri, String.class);
- 有参GET请求
Map<String, Object> map = new HashMap<>();
map.put("name","张三");
map.put("age",19);
//方式1、getForObject
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
String object = restTemplate.getForObject(url+"?name={name}&age={age}", String.class,map);
//方式2、getForEntity
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url + "?name={name}&age={age}", String.class, map);
String body = responseEntity.getBody();
//方式3、exchange
// 请求头设置,不需要可以直接给null
HttpHeaders headers = new HttpHeaders();
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(null, headers);
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
ResponseEntity<String> responseEntity = restTemplate.exchange(url + "?name={name}&age={age}", HttpMethod.GET,requestEntity,String.class,map);
- POST请求
public static void restPostTest(){
// url
String url = "http://localhost:8300/*/*/*/getStr";
// 请求头设置
HttpHeaders headers = new HttpHeaders();
headers.set("phone","sfffdd");
headers.setContentType(APPLICATION_JSON);
headers.setAccept(Lists.newArrayList(APPLICATION_JSON));
// 请求体
RestDto restDto = new RestDto();
restDto.setAge(20);
restDto.setName("老刘");
String requestBody = JSONObject.toJSONString(restDto);
try {
RestTemplate restTemplate = new RestTemplate(RestTemplateTestConfig.getHttpComFactory());
HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
String body = responseEntity.getBody();
System.out.println(body);
}catch (Exception e){
e.printStackTrace();
}
}