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; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。