RestTemplate 因为RestTemplate是Spirng框架提供的所以只要是一个Springboot项目就不用考虑导包的问题,这些都是提供好的。但是Spring并没有将其加入SpringBean容器中,需要我们手动加入,因为我们首先创建一个Springboot配置类,再在配置类中将我们的RestTemlate注册到Bean容器中
使用Springboot提供的RestTemplateBuilder构造类来构造一个RestTemplate,可以自定义一些连接参数,如:连接超时时间,读取超时时间,还有认证信息等
@Configuration
public class WebConfiguration {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder//设置连接超时时间.setConnectTimeout(Duration.ofSeconds(5000))//设置读取超时时间.setReadTimeout(Duration.ofSeconds(5000))//设置认证信息.basicAuthentication("username","password")//设置根路径.rootUri("https://api.test.com/")//构建.build();}
}
@Slf4j
public class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {//打印请求明细logRequestDetails(request,body);ClientHttpResponse response = execution.execute(request, body);//打印响应明细logResponseDetails(response);return response;}private void logRequestDetails(HttpRequest request, byte[] body){log.debug("Headers:{}",request.getHeaders());log.debug("body:{}",new String(body, StandardCharsets.UTF_8));log.debug("{}:{}",request.getMethod(),request.getMethodValue());}private void logResponseDetails(ClientHttpResponse response) throws IOException {log.debug("Status code : {}",response.getStatusCode());log.debug("Status text : {}",response.getStatusText());log.debug("Headers : {}",response.getHeaders());log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(),StandardCharsets.UTF_8));}
}
@Configuration
public class WebConfiguration {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder.additionalInterceptors(new CustomClientHttpRequestInterceptor())//构建.build();}
}
RestTemplate API使用public T getForObject(...)
public ResponseEntity getForEntity(...)
getForEntity()getForEntity()方法
第一个参数为我要调用服务的URL,
第二个参数则为响应内容的类的类型,还可以添加第三个参数,
第三个参数为一个可变参数 代表着调用服务时的传参,第三个参数可以使用key-value的map来传入参数
public void queryWeather() {ResponseEntity
getForObject()相比于前者getForEntity()该方法则是,更偏向于直接获取响应内容的,因为他直接返回响应实体的body(响应内容)
public void queryWeather() {Object body = restTemplate.getForObject(
"https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", Object.class);System.out.println(body);
}
public URI postForLocation(...)
public T postForObject(...)
public ResponseEntity postForEntity(...)
postForEntity()该方法有三个参数,
第一个为调用服务的地址(URL)
第二个参数表示上传的参数(json格式提交)
第三个表示返回响应内容的具体类型
第四个参数也用于指定参数(在URL中添加)
@Override
public void queryWeather() {User user = new User();user.setName("鲁大师");ResponseEntity
postForObject()public void queryWeather() {User user = new User();user.setName("鲁大师");JSONObject result = restTemplate.postForObject(
"https://httpbin.org/post", user, JSONObject.class);MediaType contentType = result .getHeaders().getContentType();System.out.println(contentType);System.out.println("消息响应内容:"+result .getBody());
}
postForLocation()postForLocation传参用法与前两者一致,只不过返回从实体变成了一个URL,因此它不需要指定返回响应内容的类型。
public void queryWeather() {User user = new User();user.setName("鲁大师");URI uri = restTemplate.postForLocation(
"https://httpbin.org/post", user);System.out.println(uri);}
这个只需要服务提供者返回一个 URI 即可,该URI返回值体现的是:用于提交完成数据之后的页面跳转,或数据提交完成之后的下一步数据操作URI。