Springboot之restTemplate
同步客户端执行HTTP请求,在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模板,此外还提供了支持不太常见情况的通用交换和执行方法。 **RestTemplate通常用作共享组件。然而,它的配置不支持并发修改,因此它的配置通常是在启动时准备的。**如果需要,您可以在启动时创建多个不同配置的RestTemplate实例。如果这些实例需要共享HTTP客户端资源,它们可以使用相同的底层ClientHttpRequestFactory。 注意:从5.0开始,这个类处于维护模式,只有对更改和错误的小请求才会被接受。请考虑使用org.springframework.web.react .client. webclient,它有更现代的API,支持同步、异步和流场景。
@Configuration
public class RemoteCallConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
public Result doHandlePostJson(String restUri, String jsonData)
throws Exception {
Result result = null;
try {
// logger记录
log.info("doHandlePostJson request restUri:" + restUri
+ " sendData:" + jsonData);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity request = new HttpEntity(jsonData, headers);
// 发送http服务请求
ResponseEntity<String> response = restTemplate.postForEntity(
restUri, request, String.class);
// 判断返回结果
if (response.getStatusCode() == HttpStatus.OK) {
// logger记录
log.debug("doHandlePostJson restUri response success,interfaceUri:"
+ restUri);
// 获得返回结果
String repData = response.getBody();
// logger记录
log.info("doHandlePostJson restUri response success,return data:"
+ repData);
// 返回成功
result = Result.succeed(repData, "");
} else {
// logger记录
log.info("doHandlePostJson restUri response error,interfaceUri:"
+ restUri + " http status:" + response.getStatusCode());
// 返回产品Gateway通讯异常错误
result = Result.failed("请求外部系统异常");
}
} catch (ResourceAccessException e) {
// logger记录
log.error("doHandlePostJson restUri ResourceAccessException:", e);
// 返回通讯异常错误
result = Result.failed("请求外部系统超时");
} catch (Exception e) {
// logger记录
log.error("doHandlePostJson restUri Exception:", e);
// 返回通讯异常错误
result = Result.failed("请求外部系统未知异常");
} finally {
// 关闭
}
return result;
}
package org.springframework.http;
HttpHeaders
public class HttpHeaders implements MultiValueMap<String, String>, Serializable
HttpEntity
public class HttpEntity
HttpStatus
public enum HttpStatus
Java发送http请求可以使用Spring提供的RestTemplate,使用的基本步骤如下:
- 注册RestTemplate到Spring容器
- 调用RestTemplate的API发送请求,常见方法有:
- getForObject:发送Get请求并返回指定类型对象
- PostForObject:发送Post请求并返回指定类型对象
- put:发送PUT请求
- delete:发送Delete请求
- exchange:发送任意类型请求,返回ResponseEntity
在微服务中,如果用到了注册中心,那么使用open-feign进行远程调用会更好,不使用RestTemplate了。
Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:
- HttpURLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OK Http.
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。