RestTemplate的学习与使用

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值