- 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是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请求的话可以直接在拼接请求路径后直接拼接参数/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请求需要用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)
与PUT一样,DELETE方法只有一类
HEADER也只有一类方法 : 主要用来发送请求获取响应头部信息,但是像DELETE、PUT这类没有响应的方法,是不能使用该方法的(因为没有响应也就没有响应头了)。
- public HttpHeaders headForHeaders()
该方法的主要用来判断该服务地址,能够使用那种方法去执行
- public Set optionsForAllow()
@Test
void contextLoads() {
//请求地址
String url = "http://httpbin.org/get";
Set<HttpMethod> httpMethods = restTemplate.optionsForAllow(url);
System.out.println(httpMethods);
}
- ResponseEntity exchange()
@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
java的 RestTemplate中的exchange()方法 允许指定 post, get等方法,比 execute()方法应用更广
- T execute()
该方法就是执行请求的方法,我们可以发现上述的所有方法的最后执行都是调用的该方法执行;