springboot(39) : RestTemplate完全体
HTTP请求调用集成,支持GET,POST,JSON,Header调用,日志打印,请求耗时计算,设置中文编码
1.使用(注入RestTemplateService)
@Autowiredprivate RestTemplateService restTemplateService;
2.RestTemplate配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;import java.nio.charset.Charset;
import java.util.List;@Configuration
public class RestTemplateConfig {/*** 超时时间3秒*/private static final int TIME_OUT = 1000 * 3;@Beanpublic RestTemplate restTemplate() {SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();// 链接超时设置requestFactory.setConnectTimeout(TIME_OUT);requestFactory.setReadTimeout(TIME_OUT);RestTemplate restTemplate = new RestTemplate(requestFactory);List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();httpMessageConverters.stream().forEach(httpMessageConverter -> {if (httpMessageConverter instanceof StringHttpMessageConverter) {StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;messageConverter.setDefaultCharset(Charset.forName("UTF-8"));}});return restTemplate;}
}
3.maven依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.14</version><scope>provided</scope></dependency>
4.RestTemplateService
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;
import java.util.Map;@Service
@Slf4j
public class RestTemplateService {@Autowiredprivate RestTemplate restTemplate;private static final String LOG_PATTERN = System.lineSeparator()+ " method:{}" + System.lineSeparator()+ " url:{}" + System.lineSeparator()+ " req:{}" + System.lineSeparator()+ " header:{}" + System.lineSeparator()+ " resp:{}" + System.lineSeparator()+ " time:{}" + System.lineSeparator();public String get(String url) {long currentTimeMillis = System.currentTimeMillis();try {String resp = restTemplate.getForObject(url, String.class);log.info(LOG_PATTERN, "get", url, "-", "-", smallStr(resp), getHaoShi(currentTimeMillis));return resp;} catch (Exception e) {log.error("接口调用失败,url:{}", url, ExceptionUtils.getStackTrace(e));return null;}}public String getHeader(String url, Map<String, String> headerParms) {long currentTimeMillis = System.currentTimeMillis();HttpHeaders headers = new HttpHeaders();headerParms.forEach((k, v) -> headers.set(k, v));HttpEntity<String> request = new HttpEntity<>(headers);try {String resp = restTemplate.exchange(url, HttpMethod.GET, request, String.class).getBody();log.info(LOG_PATTERN, "getHeader", url, "-", JSONObject.toJSONString(headerParms), smallStr(resp), getHaoShi(currentTimeMillis));return resp;} catch (Exception e) {log.error("接口调用失败,url:{},headerParms:{}", url, JSONObject.toJSONString(headerParms), ExceptionUtils.getStackTrace(e));return null;}}public String post(String url, JSONObject req) {long currentTimeMillis = System.currentTimeMillis();// http请求头HttpHeaders headers = new HttpHeaders();// 请求头设置属性headers.setContentType(MediaType.APPLICATION_JSON_UTF8);String reqs = JSONObject.toJSONString(req);HttpEntity<String> request = new HttpEntity<>(reqs, headers);ResponseEntity<String> result;try {result = restTemplate.exchange(url, HttpMethod.POST, request, String.class);log.info(LOG_PATTERN, "post", url, reqs, "-", smallStr(result.getBody()), getHaoShi(currentTimeMillis));return result.getBody();} catch (Exception e) {log.error("接口调用失败,url:{},req:{}", url, reqs.length() < 10000 ? reqs : "", e);return null;}}public String postStr(String url, String req) {long currentTimeMillis = System.currentTimeMillis();// http请求头HttpHeaders headers = new HttpHeaders();// 请求头设置属性headers.setContentType(MediaType.APPLICATION_JSON_UTF8);HttpEntity<String> request = new HttpEntity<>(req, headers);ResponseEntity<String> result;try {result = restTemplate.exchange(url, HttpMethod.POST, request, String.class);log.info(LOG_PATTERN, "postStr", url, req, "-", smallStr(result.getBody()), getHaoShi(currentTimeMillis));return result.getBody();} catch (Exception e) {log.error("接口调用失败,url:{},req:{}", url, smallStr(req), e);return null;}}public static String smallStr(String str) {if (str == null) {return null;}boolean tooLong = str.length() > 1000;return tooLong ? str.substring(0, 1000) + " ..." : str;}/*** 计算耗时** @param time 开始时间戳(毫秒)* @return*/public static String getHaoShi(Long time) {long t = System.currentTimeMillis() - time;double d7 = t / 1000.0 / 60 / 60 / 24 / 30 / 12 / 100;if (d7 > 1)return round(d7, 1) + "纪元";double d6 = t / 1000.0 / 60 / 60 / 24 / 30 / 12;if (d6 > 1)return round(d6, 1) + "年";double d5 = t / 1000.0 / 60 / 60 / 24 / 30;if (d5 > 1)return round(d5, 1) + "月";double d4 = t / 1000.0 / 60 / 60 / 24;if (d4 > 1)return round(d4, 1) + "天";double d3 = t / 1000.0 / 60 / 60;if (d3 > 1)return round(d3, 1) + "小时";double d2 = t / 1000.0 / 60;if (d2 > 1)return round(d2, 1) + "分钟";double d1 = t / 1000.0;if (d1 > 1)return round(d1, 1) + "秒";return t + "毫秒";}public static Double round(Double data, int amount) {if (data == null) {return null;} else {double result = (new BigDecimal(data)).setScale(amount, 4).doubleValue();return result;}}
}
相关文章:
springboot(39) : RestTemplate完全体
HTTP请求调用集成,支持GET,POST,JSON,Header调用,日志打印,请求耗时计算,设置中文编码 1.使用(注入RestTemplateService) Autowiredprivate RestTemplateService restTemplateService; 2.RestTemplate配置类 import org.springframework.context.annotation.Bean; import org.…...
python中计算2的32次方减1,python怎么算2的3次方
大家好,给大家分享一下怎么样用python编写2的n次方,n由键盘输入,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! ---恢复内容开始--- 1、内置函数:取绝对值函数abs() 2、内置函数:取最大值max()ÿ…...
阿里云SLB负载均衡ALB、CLB和NLB有什么区别?
阿里云负载均衡SLB分为传统型负载均衡CLB(原SLB)、应用型负载均衡ALB和网络型负载均衡NLB,三者有什么区别?CLB是之前的传统的SLB,基于物理机架构的4层负载均衡;ALB是应用型负载均衡,7层负载均衡…...
SynergyNet(头部姿态估计 Head Pose Estimation)复现 demo测试
目录 0 相关资料1 环境搭建2 安装 SynergyNet3 下载相关文件4 编译5 测试 0 相关资料 SynergyNet(github):https://github.com/choyingw/SynergyNet 1 环境搭建 我用的AutoDL平台搭建 选择镜像 PyTorch 1.9.0 Python 3.8(ubuntu18.04) Cu…...
mysql高级(尚硅谷-夏磊)
目录 内容介绍 Linux下MySQL的安装与使用 Mysql逻辑架构 Mysql存储引擎 Sql预热 索引简介 内容介绍 1、Linux下MySQL的安装与使用 2、逻辑架构 3、sql预热 Linux下MySQL的安装与使用 1、docker安装docker run -d \-p 3309:3306 \-v /atguigu/mysql/mysql8/conf:/etc/my…...
C++实用技术(二)std::function和bind绑定器
目录 简介std::functionstd::function对象包装器std::function做回调函数 std::bind绑定器bind绑定普通函数bind绑定成员函数 简介 C11新增了std::function和std::bind。用于函数的包装以及参数的绑定。可以替代一些函数指针,回调函数的场景。 std::function std…...
vue框架 element导航菜单el-submenu 简单使用方法--以侧边栏举例
1、目标 实现动态增删菜单栏的效果,所以要在数据库中建表 2 、建表 2.1、表样式 2.2、表数据 3、实体类 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.List;Data AllArgsConstructor NoArgsConstr…...
Nodejs 第八章(npm搭建私服)
构建npm私服 构建私服有什么收益吗? 可以离线使用,你可以将npm私服部署到内网集群,这样离线也可以访问私有的包。提高包的安全性,使用私有的npm仓库可以更好的管理你的包,避免在使用公共的npm包的时候出现漏洞。提高…...
React Native获取手机屏幕宽高(Dimensions)
import { Dimensions } from react-nativeconsole.log(Dimensions, Dimensions.get(window)) 参考链接: https://www.reactnative.cn/docs/next/dimensions#%E6%96%B9%E6%B3%95 https://chat.xutongbao.top/...
kubernetes基于helm部署gitlab
kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb默认存储类,为gitlab pods提供持久化存储&…...
jmeter 5.1彻底解决中文上传乱码
1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接:多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java...
云运维工具
企业通常寻找具有成本效益的方法来优化创收,维护物理基础架构以托管服务器和应用程序以提供服务交付需要巨大的空间和前期资金,最重要的是,物理基础设施会产生额外的运营支出以进行定期维护,这对收入造成了沉重的损失。 云使企业…...
【RL】Wasserstein距离-GAN背后的直觉
一、说明 在本文中,我们将阅读有关Wasserstein GANs的信息。具体来说,我们将关注以下内容:i)什么是瓦瑟斯坦距离?,ii)为什么要使用它?iii) 我们如何使用它来训练 GAN&…...
sentinel引入CommonFilter类
最近在做一个springcloudAlibaba项目,做链路流控模式时需要将入口资源关闭聚合,做法如下: spring-cloud-alibaba v2.1.1.RELEASE及前,sentinel1.7.0及后: 1.pom 中引入: <dependency><groupId>…...
Phoenix创建local index失败
执行创建local index出现如下错误 0: jdbc:phoenix:hbase01:2181> create local index local_index_name on "test" ("user"."name","user"."address"); 23/07/28 17:28:56 WARN client.SyncCoprocessorRpcChannel: Cal…...
css3 hover border 流动效果
/* Hover 边线流动 */.hoverDrawLine {border: 0 !important;position: relative;border-radius: 5px;--border-color: #60daaa; } .hoverDrawLine::before, .hoverDrawLine::after {box-sizing: border-box;content: ;position: absolute;border: 2px solid transparent;borde…...
jdk安装
JDK的下载、安装和环境配置教程(2021年,win10)_「已注销」的博客-CSDN博客_jdk 以上文章如果没有成功在环境变量中part再添加一句 C:\Program Files (x86)\Java\jdk1.7.0_80\bin 安装目录下的bin目录 写完环境后重启 📎jdk-20_w…...
utf8mb4_general_ci 和utf8mb4_unicode_ci有什么异同,有什么优劣
utf8mb4_general_ci 和 utf8mb4_unicode_ci 都是 MySQL 数据库中的字符集和排序规则(collation)。它们主要用于指定字符数据的排序和比较规则,以确保在数据库中对字符串进行查询和比较时得到正确的结果。 异同点: 1. utf8mb4_gen…...
java实现钉钉群机器人@机器人获取信息后,机器人回复(机器人接收消息)
1.需求 鉴于需要使用钉钉群机器人回复,人们提出的问题,需要识别提出的问题中的关键词,后端进行处理实现对应的业务逻辑 2.实现方式 用户群机器人,附带提出的问题,后端接收消息后识别消息内容,读取到关键…...
ffmpeg转码时出现missing picture in access unit with size 14019
使用ffmpeg录制网络流视频,因为网卡的缘故导致录制中断,视频在转换的时候就出现这个问题。 missing picture in access unit with size 14019怀疑是在最后的地方视频是损坏的,索性截取掉最后的2秒时间,原本视频时长是02:06:28&am…...
OpenSpec 介绍与使用:让 AI 编程从“聊天驱动”变成“规格驱动”
一、为什么需要 OpenSpec? AI 编程工具越来越强,但很多人在使用 AI 写代码时会遇到一个问题:需求都在聊天记录里,代码越写越快,但上下文越来越乱,最终很难判断 AI 实现的到底是不是最初想要的东西。 OpenSp…...
Codex+Coze自动化工作流实战
Codex(特指OpenAI的编程特化AI Agent)与Coze(扣子)平台的结合,能够实现从自然语言描述到可运行自动化流程的端到端生成。其核心在于利用Codex强大的代码理解和生成能力,来编写、调试并封装符合Coze平台规范…...
别等 SQL 跑慢了再靠猜,NineData 怎样把问题一步步看清
SQL 变慢最怕的不是慢本身,而是大家一开始只能靠猜。明明语法没报错,业务一上线却卡住了;多了一个函数、少了一个索引,或者关联顺序不合适,就可能让数据库白白扫描一大堆数据。在很多团队里,这类问题最早往…...
Perplexity搜索功能隐藏入口全解锁:9个未公开Pro技巧,第7个连官方文档都没写!
更多请点击: https://intelliparadigm.com 第一章:Perplexity搜索功能隐藏入口全解锁:现象与价值重估 Perplexity.ai 的公开界面长期以简洁问答框为核心,但其底层实际嵌套了多组未在UI中显式暴露的高级搜索能力——包括语义过滤、…...
TPFanCtrl2:ThinkPad笔记本风扇控制的终极自定义方案
TPFanCtrl2:ThinkPad笔记本风扇控制的终极自定义方案 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 对于ThinkPad用户而言,原厂的风扇控制策略…...
网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?
网络安全有哪些岗位?如何成为一名优秀的网络安全工程师? 网络安全是什么? 首先说一下什么是网络安全?其中,网络安全工程师工作内容具体有哪些? 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护…...
为什么你的Perplexity搜索总返回噪音结果?7步精准提示工程诊断流程
更多请点击: https://intelliparadigm.com 第一章:Perplexity搜索结果噪音现象的本质剖析 Perplexity 作为基于大语言模型的语义搜索引擎,其结果页中高频出现的“噪音”并非传统关键词匹配失准所致,而是源于其底层推理机制与用户…...
苹果Siri 2025全面升级:从LLM集成到系统级智能体的技术路径解析
1. 项目概述:一次迟来的“大脑”升级最近,关于苹果Siri将在2025年迎来全面优化的消息,在圈内引发了不小的讨论。作为一名长期关注智能交互领域发展的从业者,我对此并不感到意外,反而觉得这是一次“虽迟但到”的必要手术…...
Vivado FPGA设计:基于IP核的系统级集成与高效开发实践
1. 引言:从“造轮子”到“搭积木”的设计范式转变如果你在数字电路设计领域摸爬滚打超过五年,大概率经历过从ISE到Vivado的迁移阵痛。2012年,当Xilinx推出Vivado时,很多习惯了ISE“代码驱动”工作流的老工程师都感到不适应——这个…...
别再只盯着原理图了!FPGA/SoC硬件工程师必看的RGMII接口PCB布线实战指南(含时序约束与等长规则)
RGMII接口PCB设计实战:从时序规范到千兆以太网稳定通信 在FPGA和SoC硬件开发中,RGMII接口设计一直是工程师们又爱又恨的挑战。爱它的简洁高效——相比GMII接口减少了近一半的引脚数量;恨它的时序敏感——一个看似微小的PCB布线失误就可能导致…...
