在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。Spring 官网对它的介绍如下:
RestTemplate: The original Spring REST client with a synchronous, template method API.
从上面的介绍中我们可以知道:RestTemplate 是一个同步的 Rest API 客户端。下面我们就来介绍下 RestTemplate 的常用功能。
getForObject — optionsForAllow 分为一组,这类方法是常规的 Rest API(GET、POST、DELETE 等)方法调用;
exchange:接收一个 RequestEntity 参数,可以自己设置 HTTP method,URL,headers 和 body,返回 ResponseEntity;
execute:通过 callback 接口,可以对请求和返回做更加全面的自定义控制。
创建 RestTemplate 时需要一个 ClientHttpRequestFactory,通过这个请求工厂,我们可以统一设置请求的超时时间,设置代理以及一些其他细节。通过上面代码配置后,我们直接在代码中注入 RestTemplate 就可以使用了。
有时候我们还需要通过 ClientHttpRequestFactory 配置最大链接数,忽略SSL证书等,大家需要的时候可以自己查看代码设置
解释:两种写法
//使用 RestTemplateBuilder.build() 代替 new RestTemplate()
//使用 RestTemplateBuilder.build()
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
//代替 new RestTemplate()
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
下面开始正式代码
第一步:
首先添加一个RestTemplateConfig配置文件
package com.school.init.config;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.ssl.TrustStrategy;
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;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
/**
* restTemplate配置类
*
* @author Json
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
return factory;
}
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException
{
TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(httpClient);
return factory;
}
}
第二步:
修改初始化RestTemplate类:
@Bean
public RestTemplate getRestTemplate() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
return new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
}
第三步:封装调用方法
/**
* 调用第三方服务器接口
* 传入JSONObject表示post请求
* 不传表示get请求
* @param url 路由
* @param jsonObject 参数
* @param method 方法
* @return
*/
public JSONObject getApi(String url, JSONObject jsonObject, HttpMethod method, List<String> stringList) throws Exception{
RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
//此处加编码格式转换
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(org.springframework.http.MediaType.APPLICATION_JSON_UTF8);
httpHeaders.put("Authorization",stringList);
HttpEntity httpEntity = new HttpEntity(jsonObject, httpHeaders);
//访问第三方服务器
ResponseEntity<String> exchange = restTemplate.exchange(url, method, httpEntity, String.class);
return JSONObject.parseObject(exchange.getBody(),JSONObject.class);
}
调用方式:
AiRobotRequest data = aiRobotRequest.getData();
String accessToken = "";
JSONObject jsonData = (JSONObject) JSON.toJSON(data);
String url="";
List<String> stringList=new ArrayList<>();
stringList.add("Bearer "+accessToken);
JSONObject s =getApi(url, jsonData,HttpMethod.POST,stringList);
log.info("微信消息返回值" + s);