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
    评论
### 回答1: Spring RestTemplate是Spring框架中的一个重要组件,用于简化HTTP请求的发送。使用RestTemplate可以实现对RESTful Web服务的访问,支持GET、POST、PUT、DELETE等常见的HTTP请求方法。 下面是Spring RestTemplate的一些基本使用方法: 1. 创建RestTemplate实例: ```java RestTemplate restTemplate = new RestTemplate(); ``` 2. 发送GET请求: ```java String url = "http://example.com/users/{userId}"; ResponseEntity<User> response = restTemplate.getForEntity(url, User.class, userId); ``` 3. 发送POST请求: ```java String url = "http://example.com/users"; User user = new User(); ResponseEntity<User> response = restTemplate.postForEntity(url, user, User.class); ``` 4. 发送PUT请求: ```java String url = "http://example.com/users/{userId}"; User user = new User(); restTemplate.put(url, user, userId); ``` 5. 发送DELETE请求: ```java String url = "http://example.com/users/{userId}"; restTemplate.delete(url, userId); ``` RestTemplate还有很多其他的方法,更详细的使用方法可以参考Spring官方文档。 ### 回答2: Spring RestTemplate是Spring框架提供的用于处理RESTful请求的模板类。它封装了底层的HTTP通信细节,提供了简化的API,使得开发者可以更方便地发送HTTP请求和接收响应。 在使用RestTemplate之前,我们首先需要在项目的依赖中引入Spring的web模块,因为RestTemplate是web模块的一部分。 使用RestTemplate发送HTTP请求的步骤如下: 1. 创建一个RestTemplate对象。可以直接通过new关键字创建,也可以通过Spring的依赖注入方式获取。 2. 选择合适的请求方法,并设置请求的URL和请求参数。RestTemplate提供了多种请求方法,如GET、POST等。我们可以通过参数的形式传递URL,并可以使用Map或对象封装请求参数。 3. 发送请求,并接收响应。可以调用RestTemplate的exchange()方法来发送请求,并通过ResponseEntity来接收响应。exchange方法可以指定请求方法、URL、请求体、请求头等信息,并可以通过参数化类型来指定响应的类型。 4. 解析响应。根据实际需要,我们可以使用ResponseEntity的getBody()方法获取响应的主体内容,并进行进一步的解析。 需要注意的是,使用RestTemplate发送请求时,我们可以自己编写请求头、请求体等信息,也可以通过使用RestTemplate提供的辅助方法来简化请求的构建。此外,RestTemplate还提供了异常处理和重试机制,可以更好地处理异常情况。 总的来说,Spring RestTemplate提供了简洁易用的API,帮助我们快速发送HTTP请求和处理响应,节省了开发时间和精力。它是Spring框架中非常重要的一部分,值得开发者深入学习和掌握。 ### 回答3: Spring RestTemplate是Spring框架中的一个HTTP访问客户端工具,它可以方便地进行HTTP请求的发送和响应的处理。 在使用RestTemplate之前,首先需要引入相关的依赖。在Maven项目中,可以通过在pom.xml文件中添加以下依赖来使用RestTemplate: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 引入依赖后,可以通过如下方式创建一个RestTemplate对象: ``` RestTemplate restTemplate = new RestTemplate(); ``` 之后就可以使用RestTemplate对象来发送HTTP请求了。RestTemplate提供了多种发送请求的方法,例如getForObject()、postForObject()等。 使用getForObject()方法发送GET请求并接收响应: ``` String url = "http://api.example.com/data"; String response = restTemplate.getForObject(url, String.class); ``` 使用postForObject()方法发送POST请求并接收响应: ``` String url = "http://api.example.com/data"; String requestBody = "param1=value1&param2=value2"; String response = restTemplate.postForObject(url, requestBody, String.class); ``` RestTemplate还提供了其他一些方法,例如exchange()方法可以发送更复杂的请求,并接收带有响应头和状态码等信息的响应对象。 在使用RestTemplate发送请求时,可以通过设置请求头、请求体、URI参数等来定制请求。可以通过如下方式来设置请求头: ``` HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer token"); HttpEntity<String> requestEntity = new HttpEntity<>(headers); ``` 可以通过如下方式来设置请求体: ``` MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); requestBody.add("param1", "value1"); requestBody.add("param2", "value2"); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody); ``` 可以通过如下方式来设置URI参数: ``` String url = "http://api.example.com/data?param1={param1}&param2={param2}"; Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("param1", "value1"); uriVariables.put("param2", "value2"); String response = restTemplate.getForObject(url, String.class, uriVariables); ``` 总结来说,Spring RestTemplate是一个用于发送和处理HTTP请求的方便工具,通过引入相关依赖并创建RestTemplate对象,可以使用它发送不同类型的HTTP请求,并对响应进行处理。通过设置请求头、请求体、URI参数等,可以对请求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值