使用RestTemplate发送与接收http/https请求
一、什么是httpHTTP(超文本传输协议)是互联网上应用最广泛的应用层协议,用于在客户端(通常是浏览器)和服务器之间传输超文本(如网页)及其他资源(如图片、视频、文件等)。它是万维网(WWW)数据通信的基础。
1、首先我们需要导入依赖,请确保你的服务有Spring Web依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
pringboot提供两种实例RestTemplate方式,一种是注解依赖,另一种直接new即可
private final RestTemplate restTemplate;
或者
RestTemplate restTemplate =new RestTemplate();
2、 如何发送GET请求因get请求不推荐也不允许将入参放入body体中,并且对url长度有所限制,适合简单请求发送
普通GET请求:
// 普通GET请求
String url = "https://api.example.com/data";
String result = restTemplate.getForObject(url, String.class);
System.out.println("响应内容: " + result);
携带响应头与响应状态码的get请求:
// 携带响应头与响应状态码的get请求
String url = "https://api.example.com/data";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders headers = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + headers.toString());
System.out.println("获取响应体: " + body);
携带参数的get请求:
// 携带参数的get请求
String url = "https://api.example.com/data?key1="+"我是key1的值"+"&"+"key2="+"我是key2的值";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders headers = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + headers.toString());
System.out.println("获取响应体: " + body);
携带请求头的get请求:
// 携带请求头的get请求
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer token123"); // 添加请求头
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
String url = "https://api.example.com/data?key1="+"我是key1的值"+"&"+"key2="+"我是key2的值";
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders resHeaders = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + resHeaders.toString());
System.out.println("获取响应体: " + body);
3、 如何发送POST请求如遇文件或大量敏感数据,或服务端有要求的,需要使用post请求方式
简单POST请求:
// 简单POST请求
String url = "https://api.example.com/data";
String result = restTemplate.postForObject(url, null, String.class);
System.out.println("响应内容: " + result);
携带响应头与响应状态码的POST请求:
// 携带响应头与响应状态码的POST请求
String url = "https://api.example.com/data";
ResponseEntity<String> response = restTemplate.postForEntity(url, null, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders headers = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + headers.toString());
System.out.println("获取响应体: " + body);
发送表单数据:
// 发送表单数据
String url = "https://api.example.com/data";
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
arams.add("username", "admin");
params.add("password", "123456");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity requestEntity = new HttpEntity(params, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders responseHeaders = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + responseHeaders.toString());
System.out.println("获取响应体: " + body);
发送JSON数据:
// 发送JSON数据
String url = "https://api.example.com/data";
Map<String, Object> map = new HashMap<>();
map.put("username", "admin");
map.put("password", "123456");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(map, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, httpEntity, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders responseHeaders = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + responseHeaders.toString());
System.out.println("获取响应体: " + body);
发送文件:
// 发送文件
String url = "https://api.example.com/data";
HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);
Resource fileResource = new FileSystemResource("/path/to/file.txt");
MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.add("file", fileResource);
multiValueMap.add("comment", "测试文件上传");
HttpEntity httpEntity = new HttpEntity(multiValueMap, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, httpEntity, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders responseHeaders = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + responseHeaders.toString());
System.out.println("获取响应体: " + body);
4、 如何发送其他请求其他请求在get中大家也看到,可以采用exchange方式来实现
// 类似如下
Map<String, String> requestParam = new HashMap<>();
requestParam.put("admin", "123456");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity requestEntity = new HttpEntity(requestParam, httpHeaders);
String url = "https://api.example.com/data";
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, requestEntity, String.class);
HttpStatus statusCode = response.getStatusCode(); // 获取状态码
HttpHeaders resHeaders = response.getHeaders(); // 获取响应头
String body = response.getBody(); // 获取响应体
System.out.println("获取响应状态码: " + statusCode.toString());
System.out.println("获取响应头: " + resHeaders.toString());
System.out.println("获取响应体: " + body);
5、 如何发送Https请求在发送https请求时如果服务端SSL证书有误或其他原因,会导致发送不成功无效证书的情况,解决办法也很简单,我们只需要忽略它的证书即可!
增加配置类:
import org.apache.http.conn.ssl.*;
import org.apache.http.impl.client.*;
import org.springframework.http.client.*;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.*;public class SSLConfig {public static RestTemplate getUnsafeRestTemplate() throws Exception {SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, (chain, authType) -> true).build();CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setSSLContext(sslContext).build();return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));}
}
然后创建实例对象:RestTemplate restTemplate = SSLConfig.getUnsafeRestTemplate();