RestTemplate的学习与使用
最近在开发过程中遇到使用接口传输数据,了解到到RestTemplate
1、 源码分析
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations {
public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
this.setRequestFactory(requestFactory);
}
}
// SimpleClientHttpRequestFactory 实现了ClientHttpRequestFactory 可以设置请求时间和超时时间等...
public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory {
// 设置参数
private static final int DEFAULT_CHUNK_SIZE = 4096;
@Nullable
private Proxy proxy;
private boolean bufferRequestBody = true;
private int chunkSize = 4096;
private int connectTimeout = -1;
private int readTimeout = -1;
private boolean outputStreaming = true;
@Nullable
private AsyncListenableTaskExecutor taskExecutor;
}
2、 创建Util
public class ConnectionUtil {
public static RestTemplate getConnectionFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
RestTemplate restTemplate = new RestTemplate(factory);
// 设置请求返回的编码格式
List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
httpMessageConverters.stream().forEach(httpMessageConverter -> {
if(httpMessageConverter instanceof StringHttpMessageConverter){
StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
}
});
return restTemplate;
}
}
3、post请求
// 设置请求参数
Map<String, Object> param = new HashMap<>();
param.put("username", username);
param.put("password", password);
String url = loginOn_URL;
// post请求try-catch包起来
try {
RestTemplate restTemplate = ConnectionUtil.getConnectionFactory();
//设置contentType类型
HttpHeaders headers = new HttpHeaders();
// 设置请求内容类型
headers.setContentType(MediaType.APPLICATION_JSON);
// 保持长连接
headers.add("Connection", "Keep-Alive");
// 设置Authorization身份验证
headers.add("Authorization", "Bearer " + Token);
HttpEntity<Map<String, Object>> request = new HttpEntity(param, headers);
// 直接返回结果
String result = restTemplate.postForObject(url, request, String.class);
// 返回结果转换成JSONObject
JSONObject resultJo = JSONObject.parseObject(result);
// 得到返回结果参数
String xxx = resultJo.getString("xxx")
} catch (Exception e) {
log.error("post error");
throw new RuntimeException("post error");
}
4、get请求
// 1 请求参数在body中,格式为json的设置
Map<String, Object> param = new HashMap<>();
param.put("ProviderID", ProviderID);
String url = getStatus_URL;
JSONObject resultJo = new JSONObject();
try {
RestTemplate restTemplate = ConnectionUtil.getConnectionFactory();
HttpHeaders headers = new HttpHeaders();
//设置contentType类型
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", "Bearer " + Token);
headers.add("Connection", "Keep-Alive");
HttpEntity<Map<String, Object>> request = new HttpEntity(param, headers);
// 要使用这个方法 不使用getForObject
ResponseEntity<String> resEntity = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
resultJo = JSON.parseObject(resEntity.getBody());
log.info("get result=" + resultJo);
} catch (Exception e) {
log.error("get error");
throw new RuntimeException("get error");
}
// 2 请求参数直接拼接到url路径上的
Map<String, Object> param = new HashMap<>();
long timeMillis = System.currentTimeMillis();
param.put("ProviderID", ProviderID);
param.put("Date", timeMillis);
String url = getStaticMessage + param.get("ProviderID") + "&Date=" + param.get("Date");
JSONObject resultJo = new JSONObject();
try {
RestTemplate restTemplate = ConnectionUtil.getConnectionFactory();
//设置contentType类型
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + Token);
HttpEntity<String> request = new HttpEntity(null, headers);
ResponseEntity<String> resEntity = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
resultJo = JSONObject.parseObject(resEntity.getBody());
System.out.println("the vehicleInfo result=" + resultJo);
} catch (Exception e) {
log.error("the vehicleInfo error");
throw new RuntimeException("the vehicleInfo error");
}
5、文件内容转换成base64 的转换
// 根据本地路径将图片设置成base64格式
private String changeBase64(String url) {
// 本地文件路径
url = "D:/record saved/alarmpic/9860223/2021-12-31/9860223_082001_00-01.jpg";
InputStream in = null;
byte[] data = null;
// 读取图片字节数组
try {
in = new FileInputStream(url);
data = new byte[in.available()];
in.read(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 输出字节数组的长度
log.info("the byte length=" + data.length);
/**
*将字节数组转换成为base64格式
*/
/*
* 刚开始网上查到的这个方法,不推荐使用 会在末尾添加换行符,
* 传参数的时候会有问题,报400 bad request
BASE64Encoder encoder = new BASE64Encoder();
encoder.encode(data);
*/
// 这个方法是jdk自带的,可以不考虑换行符的问题,推荐使用
String code = Base64.getEncoder().encodeToString(data);
return code;
}