RestTemplate使用实战-exchange方法讲解

RestTemplate使用实战-exchange方法讲解RestTemplate 是什么 RestTemple 是 Spring 提供的用于访问 Http 请求的客户端 RestTemple 提供了多种简洁的远程访问服务的方法 省去了很多无用的代码 为什么要用 RestTemplate 相信大家之前都用过 apache 的 HTTPClient 类 逻辑繁琐 代码复杂 还要自己编写使用类 HttpClientUt 封装对应的 post get delete 等方法 Rest

RestTemplate使用实战(二)-复杂多层嵌套对象的处理和封装

RestTemplate是什么

RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。

为什么要用RestTemplate

相信大家之前都用过apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法。

RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。RestTemplate提供更高等级的符合HTTP的六种主要方法,可以很简单的调用RESTful服务。

RestTemplate实战

一.创建RestTemplate

创建RestTemplate很简单,只需要把RestTemplate注入到bean里面。

 @Configuration public class RestTempleConfig { 
    @Bean public RestTemplate restTemplate() { 
    return new RestTemplate(); } } 
 / * 替代默认的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使用

RestTemplate提供了六种常用的HTTP方法实现远程服务调用,RestTemplate的方法名遵循一定的命名规范,第一部分表示用哪种HTTP方法调用(get,post),第二部分表示返回类型。

创建一个RestTemplate连接

 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; } 

当然也可以写一个通用的工具类,根据传入的参数来确定请求的路径和内容。工具类肯定是想通过静态方式来直接调用,而不是通过new Util()的方式来使用。但是静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。

所以我们不能@Autowired或者@resource一个静态变量,使之成为一个spring bean。但是静态方法又不能调用非静态的属性,那么我们该怎么办呢?

@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; } } 

这个时候我们就需要维护一个工具类的静态实例,初始化的时候把restTemplate传进来,这样就可以直接调用HttpUtil.httpRequest()方法。

最后编写controller类,用我们的exchange方法远程调用,就能获取到结果了。一般来说,拿到的结果是一个json类型,我们还需要通过fastjson,Jackson等来处理我们的json字符串,获取到我们想要的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225386.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:27
下一篇 2026年3月17日 上午9:27


相关推荐

  • LangManus FAQ – AI 自动化框架常见问题解答

    LangManus FAQ – AI 自动化框架常见问题解答

    2026年3月15日
    2
  • idea集成gitee_git和idea

    idea集成gitee_git和ideaidea集成git,傻瓜式教程,超详细

    2025年6月27日
    7
  • Android之TextView超链接

    Android之TextView超链接在 TextView 添加超链接 有两种方式 第一种通过 HTML 格式化你的网址 一种是设置 autolink 让系统自动识别超链接 以下代码示例 第一种方式 publicclassM Overrideprot BundlesavedI

    2026年3月18日
    1
  • 聚类之详解FCM算法原理及应用

    聚类之详解FCM算法原理及应用之前 该文的 pdf 清晰版已被整理上传 方便保存学习 下载地址 https download csdn net download on2way 一 原理部分模糊 C 均值 FuzzyC means 算法简称 FCM 算法 是一种基于目标函数的模糊聚类算法 主要用于数据的聚类分析 理论成熟 应用广泛 是一种优秀的聚类算法 本文关于 FCM 算法的一些原理推导部分介绍等参考下

    2026年3月20日
    0
  • linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本

    linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本Struts漏洞分析ApacheStruts团队已经发布了Struts2.3.15.1安全更新版本。在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是用JAVA做的,没有把版本升级,还用的是Strtus2.3.15.1版本之前的话,那么你们就要小心,服务器被黑了哦。下面就来说一下之前版本,Struts2的漏洞是如何产生的,我们自己去做,该如何的去解决这个…

    2022年7月19日
    15
  • 苏州工业园区智慧党建星平台(福利院上班怎么样)

    背景需求:福利院属于民政社会保障的组成部分,是民政社会福利方向的业务之一,民政福利院等养老机构管理是面向公、私立的各种社会福利院、养老院、颐养院、养护院内部业务经办管理过程,服务的群体是困难老年人、孤老残障优抚对象、失独老年人、社会老年人。解决方案:民政养老服务信息管理解决方案主要帮助民政部门对养老行业实现信息化的管理。政府部门通过民政养老信息管理平台对养老基础数据采集、养老机构…

    2022年4月16日
    75

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号