RestTemplate之exchange方法详解说明
下文笔者讲述RestTemplate中exchange方法详解说明,如下所示
RestTemplate简介
RestTemplate是Spring提供的用于访问Http请求的客户端 RestTemplate提供了多种简洁的远程访问服务的方法
使用RestTemplate优势
RestTemplate相对于apache的HTTPClient类,RestTemplate使用非常简洁
RestTemplate
一.创建RestTemplate
@Configuration
public class RestTempleConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
默认情况下RestTemplate自动注册一组HttpMessageConverter用来处理一些不同的contentType的请求
当现有的转换器不能满足你的需求
你还可实现org.springframework.http.converter.HttpMessageConverter接口自己写一个
/**
* 替代默认的SimpleClientHttpRequestFactory
* 设置超时时间重试次数
* 同时设置一些拦截器以便监控
* @return
*/
@Bean
public RestTemplate restTemplate() {
//生成一个设置了连接超时时间、请求超时时间、异常重试次数3次
RequestConfig config = RequestConfig.custom()
.setConnectionRequestTimeout(10000)
.setConnectTimeout(10000)
.setSocketTimeout(30000).build();
HttpClientBuilder builder = HttpClientBuilder.create()
.setDefaultRequestConfig(config)
.setRetryHandler(new DefaultHttpRequestRetryHandler(3, false));
HttpClient httpClient = builder.build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
//做个日志拦截器;从性能上考虑,当前屏蔽该功能
//restTemplate.setInterceptors(Collections.singletonlist(new RestTemplateConsumerLogger()));
return restTemplate;
}
RestTemplate使用示例
getForObject:
发送GET请求
将HTTP response转换成一个指定的object对象
postForEntity:
发送POST请求
将给定的对象封装到HTTP请求体
返回类型是一个HttpEntity对象
exchange和execute方法:
上面列出的其它方法
(如getForObject、postForEntity等)使用范围更广
允许调用者指定HTTP请求的方法(GET、POST、PUT等)
且可支持像HTTP PATCH
exchange方法的语法
exchange(String url, HttpMethod method,@Nullable HttpEntity<?> requestEntity, Class responseType, Map 参数说明: url:请求路径 method:请求的方法(GET、POST、PUT等) requestEntity:HttpEntity对象,封装了请求头和请求体 responseType:返回数据类型 uriVariables:支持PathVariable类型的数据例:RestTemplate之exchange示例
private String getId(String id) {
String url = RemoteUrl + "/id";
//设置Http的Header
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
//设置访问参数
HashMap<String, Object> params = new HashMap<>();
params.put("name", name);
//设置访问的Entity
HttpEntity entity = new HttpEntity<>(params, headers);
ResponseEntity<String> result = null;
try {
//发起一个POST请求
result = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
JSONObject data = JSONObject.parseObject(result.getBody()).getJSONObject("data");
return data.getString("id");
} catch (Exception e) {
logger.error("获取id失败: " + e.getMessage());
}
return null;
}
exchange工具类编写
@Component
public class HttpUtil {
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
@Resource
private RestTemplate restTemplate;
private static HttpUtil httpUtil;
@PostConstruct
public void init(){
httpUtil = this;
httpUtil.restTemplate = this.restTemplate;
}
public static <T> String httpRequest(String url, HttpMethod method, HttpEntity<T> entity){
try {
//发起一个POST请求
ResponseEntity<String> result = httpUtil.restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
return result.getBody();
} catch (Exception e) {
logger.error("请求失败: " + e.getMessage());
}
return null;
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


