RestTemplate
admin
2024-03-27 19:13:44
0

1、简介

  • RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更为优雅的调用RESTFul服务的方式。
  • 在Spring应用程序中访问第三方REST服务与使用Spring RestTemplate类有关。RestTemplate类的设计原则与许多其他Spring的模板类(例如JdbcTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
  • RestTemplate默认依赖JDK提供了http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如Apache HttpCompoent、Netty或OKHttp等其他Http libaray。
  • 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有headForHeaders()、getForObject()、putForObject(),put()和delete()等方法。
     
  • delete() 在特定的URL上对资源执行HTTP DELETE操作
  • exchange() 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中 映射得到的
  • execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
  • getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
  • getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
  • postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的
  • postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象
  • headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
  • optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
  • postForLocation() POST 数据到一个URL,返回新创建资源的URL
  • put() PUT 资源到特定的URL

2、创建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();}    
}

3、RestTemplate API使用

3.1、GET

public  T getForObject(...)
public  ResponseEntity getForEntity(...)
  • getForEntity()

getForEntity()方法

第一个参数为我要调用服务的URL

第二个参数则为响应内容的类的类型,还可以添加第三个参数,

第三个参数为一个可变参数 代表着调用服务时的传参,第三个参数可以使用key-value的map来传入参数

public void queryWeather() {ResponseEntity forEntity = restTemplate.getForEntity(
"https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", Object.class);System.out.println("状态码:"+forEntity.getStatusCode());System.out.println("状态码内容:"+forEntity.getStatusCodeValue());HttpHeaders headers = forEntity.getHeaders();System.out.println("响应头:"+headers);Object body = forEntity.getBody();System.out.println("响应内容:"+body);
}
 
  • 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);
}

3.2、POST

public URI postForLocation(...)
public  T postForObject(...)
public  ResponseEntity postForEntity(...)
  • postForEntity()

 该方法有三个参数,

 第一个为调用服务的地址(URL)

​ 第二个参数表示上传的参数(json格式提交)

​ 第三个表示返回响应内容的具体类型

​ 第四个参数也用于指定参数(在URL中添加)

@Override
public void queryWeather() {User user = new User();user.setName("鲁大师");ResponseEntity objectResponseEntity = restTemplate.postForEntity(
"https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", user, Object.class);System.out.println("消息响应内容:"+objectResponseEntity.getBody());
}
 
  • 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

相关内容

热门资讯

小棉袄电商洞察:短保零食爆火背... 当整个零食赛道还在价格战的泥潭里贴身肉搏时,长沙街头的一抹红蓝撞色,正用“新鲜”二字,悄然改写着游戏...
金价高位“吞没”!美元强势+获... 汇通财经APP讯——周三(2月26日)亚市早盘,现货黄金窄幅震荡,目前交投于5150美元/盎司附近。...
大疆反击美国禁令! 据路透社报道,中国无人机制造商大疆(DJI)周二表示,已提起诉讼,对美国联邦通信委员会(FCC)禁止...
AI算力需求刺激存储芯片股 兆... 来源:财联社 财联社2月24日讯(编辑 胡家荣)受益于海外市场消息利好,港股存储概念股走强。截至发稿...
2026年中国十大杰出品牌战略... 2026年,中国经济 将 在新质生产力驱动下稳健前行, 中国 企业竞争从产品、渠道层面升级为品牌心智...
原创 特... 一直以来,中美关系始终处于紧张状态,外部局势难以化解,特朗普却在国内遭遇了前所未有的压力。2月20日...
“红利+”指数集体涨超1%,关... 截至午间收盘,中证红利指数、国证价值100指数、国证自由现金流指数均上涨1.6%。Wind数据显示,...
ETF盘中资讯|低吸时刻?科创... 或被海外AI情绪错杀,重点布局国产AI产业链的科创人工智能ETF(589520)连跌两日,场内价格现...
哈登20分米切尔23分 骑士大... 【搜狐体育战报】北京时间2月25日NBA常规赛,主场作战的骑士以109-94击败尼克斯。阿伦19分1...
科创京津冀|十二年“聚链成群”... 2026年,京津冀协同发展迎来12周年。十二年时间,足够一个产业完成从“点”到“链”的蜕变。 早在2...
金价高位震荡!实探深圳水贝市场... 2月24日,农历正月初八,深圳水贝贵金属市场在春节“不打烊”的喧嚣后,迎来了马年首个正式工作日。尽管...
日照国资内部大调整:城投集团1... 经济导报记者 杨佳琪 2月24日,日照城投集团有限公司(下称“日照城投集团”)发布关于控股股东发生变...
南京商业大佬正式入主南通这家上... 2月24日晚间,南通上市公司*ST金灵披露公司控股股东和实际控制人变更的提示性公告。 根据《重整计划...
高特电子股权合规疑云:董事牵线... 来源丨时代商业研究院 作者丨陆烁宜 编辑丨郑琳 高校教师隐秘入股、其兄牵线融资获顾问费且获得员工持股...
大市“开门红”,白酒逆市调整,... 春节假期后首个交易日,白酒走出了“逆市”行情。 2月24日,A股大盘高开并收盘企稳4100点以上,但...
别让声誉危机,成为你融资路上的... 资本市场从来没有“温情脉脉”,只有“优胜劣汰”的残酷法则。一句广为流传的警示,道尽了企业发展的隐秘风...
钨价上涨颠覆传统逻辑,APT破... 2月25日,据中钨在线最新消息,一年来,钨价的高强度和快节奏走势,已基本颠覆了原有市场传统的交易逻辑...
波兰经济学教授:美国关税政策混... 美国最高法院20日裁定美国《国际紧急经济权力法》未授权总统大规模征收关税,美国总统特朗普当天宣布将对...
暴跌54%!非洲“一哥”跌落神... 作者:曾有为 那个曾经在非洲所向披靡、被誉为“手机中的战斗机”的传奇公司,在2026年初,交出了一份...
5个月内两次更替,涪陵榨菜迎“... 瑞财经 刘治颖 2月13日,涪陵榨菜(SZ002507)公告,提名夏强伟担任公司总经理,公司董事长、...