🍀简介
- RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。
- RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。
- 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有headForHeaders()、getForObject()、putForObject(),put()和delete()等方法。
- RestTemplate 可以看到有很多方法,我们可以提取出主要的几种方法是:
GET / POST / PUT / DELETE / HEAD / OPTIONS / EXCHANGE / EXECUTE
🍀 方法 / 步骤
📌 实例化RestTemplate
因为RestTemplate是Spirng框架提供的所以只要是一个Springboot项目就不用考虑导包的问题,这些都是提供好的。
但是Spring并没有将其加入SpringBean容器中,需要我们手动加入,因为我们首先创建一个Springboot配置类,再在配置类中将我们的RestTemlate注册到Bean容器中
方法一:
使用Springboot提供的RestTemplateBuilder构造类来构造一个RestTemplate,可以自定义一些连接参数,如:连接超时时间,读取超时时间,还有认证信息等
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder
//设置连接超时时间
.setConnectTimeout(Duration.ofSeconds(5000))
//设置读取超时时间
.setReadTimeout(Duration.ofSeconds(5000))
//设置认证信息
.basicAuthentication("username","password")
//设置根路径
.rootUri("https://api.test.com/")
//构建
.build();
}
// 或者直接进行实例化
// return new RestTemplate();
}
方法二:
在项目启动实例化这个方法即可
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
📌 GET请求
Get请求的话可以直接在拼接请求路径后直接拼接参数/app/order/getNumber?name=name,也可以使用占位符/app/order/getNumber?name={name},通过Map来传参,但不能使用LinkedMultiValueMap,否则会报错
public void queryWeather() {
ResponseEntity<Object> forEntity = restTemplate.getForEntity("https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", Object.class);
System.out.println("状态码:"+forEntity.getStatusCode());
System.out.println("状态码内容:"+forEntity.getStatusCodeValue());
HttpHeaders headers = forEntity.getHeaders();
System.out.println("响应头:"+headers);
Object body = forEntity.getBody();
System.out.println("响应内容:"+body);
}
String url = "https://xx.xx.com/app/order/getNumber?name={name}";
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.add("name", "name");
HttpHeaders headers = new HttpHeaders();
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(null,headers);
//使用另一个重载的方法传递参数集合paramMap
ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap);
📌 POST请求
post请求需要用LinkedMultiValueMap来传递参数
String url = "https://xx.xx.com/app/order/getNumber";
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
paramMap.add("name", "name");
HttpHeaders headers = new HttpHeaders();
//headers可以详细设置请求头中的信息等
//HttpEntity里面包含了请求方和相应方的请求头和请求体,类似于@RequestBody和@ResponseBody
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
ResponseEntity<String> response = template.exchange(url, HttpMethod.POST, httpEntity, String.class)
📌 DELETE
与PUT一样,DELETE方法只有一类
📌 HEADER
HEADER也只有一类方法 : 主要用来发送请求获取响应头部信息,但是像DELETE、PUT这类没有响应的方法,是不能使用该方法的(因为没有响应也就没有响应头了)。
- public HttpHeaders headForHeaders()
📌 OPTIONS
该方法的主要用来判断该服务地址,能够使用那种方法去执行
- public Set optionsForAllow()
@Test
void contextLoads() {
//请求地址
String url = "http://httpbin.org/get";
Set<HttpMethod> httpMethods = restTemplate.optionsForAllow(url);
System.out.println(httpMethods);
}
📌 EXCHANGE
- ResponseEntity exchange()
- 该接口与其他接口不同:
- 该方法允许用户指定请求的方法(get,post,put等)
- 可以在请求中增加body以及头信息,其内容通过参数HttpEntity<?> requestEntity描述
- exchange支持’含参数的类型(即泛型)'作为返回类型,该特性通通ParameterizedTypeReferenceresponseType 描述
- *该方法支持五个参数
服务地址 / 请求方法 / 写入的请求实体 / 响应内容的类型 / 扩展模板的变量或包含URI模板变量的映射*
@Test
void contextLoads() {
//请求地址
String url = "http://httpbin.org/post";
User user = new User();
user.setName("彭于晏");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<User> userHttpEntity = new HttpEntity<>(user, httpHeaders);
ResponseEntity<Object> exchange = restTemplate.exchange(url, HttpMethod.POST, userHttpEntity, Object.class);
System.out.println(exchange);
}
上述代码模拟了一个简单的POST请求 可以理解为可以动态的指定请求方法和请求实体的一个方法。
exchange(String url, HttpMethod method,@Nullable HttpEntity<?> requestEntity, Class responseType, Map
- 参数说明:
url:请求路径
method:请求的方法(GET、POST、PUT等)
requestEntity:HttpEntity对象,封装了请求头和请求体
responseType:返回数据类型
uriVariables:支持PathVariable类型的数据。
java的 RestTemplate中的exchange()方法 允许指定 post, get等方法,比 execute()方法应用更广
📌 EXECUTE
- T execute()
该方法就是执行请求的方法,我们可以发现上述的所有方法的最后执行都是调用的该方法执行;
- *该方法支持五个参数
服务URL地址 / 请求方法 / 准备请求的对象(requestCallback) / 从响应中提取返回值的对象 / 扩展模板的变量或包含URI模板变量的映射*
🍀 总结
- get和post请求适合用在不许要校验直接获取的接口, 如果想获取http协议报文的内容可以使用 xxxForEntity,如果只关注传输数据本身可以使用xxxForObjec
- DELETE ,HEAD, OPTIONS 可以补充部分信息
- EXCHANGE 使用频率较高
- EXECUTE 上面所有方法的最后执行都是调用的该方法执行