SpringBoot之远程调用的三大方式

为什么要使用远程调用?
SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择。
方式一:使用原始httpClient请求

public static Map<String, String> httpPostRequest(String url, Map<String, Object> params, int timeout) {Map<String, String> resultMap = new HashMap<>();CloseableHttpClient httpClient = HttpClients.createDefault();String result = "";try {HttpPost httpPost = new HttpPost(url);httpPost.addHeader("Content-Type", "application/json");String s = Base64.getEncoder().encodeToString(getAuthorization().getBytes());log.info("getAuthorization():{}", s);httpPost.addHeader("authorization", "Basic " + s);StringEntity se = new StringEntity(JSONObject.toJSONString(params), "utf-8");se.setContentEncoding("UTF-8");se.setContentType("application/json");httpPost.setEntity(se);HttpResponse response = httpClient.execute(httpPost);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();httpPost.setConfig(requestConfig);HttpEntity responseEntity = response.getEntity();resultMap.put("scode", String.valueOf(response.getStatusLine().getStatusCode()));resultMap.put("data", "");if (responseEntity != null) {result = EntityUtils.toString(responseEntity, java.nio.charset.Charset.forName("UTF-8"));resultMap.put("data", result);}} catch (Exception e) {resultMap.put("scode", "error");resultMap.put("data", "HTTP请求失败: " + e.getMessage());Writer w = new StringWriter();e.printStackTrace(new PrintWriter(w));} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return resultMap;}

方式二:使用RestTemplate
先封装哥工具类吧

public class RestTemplateUtils {private static final RestTemplate REST_TEMPLATE;static {HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();// 超时factory.setConnectTimeout(5000);factory.setReadTimeout(15000);SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySSL(),// 指定TLS版本null,// 指定算法null,// 取消域名验证new HostnameVerifier() {@Overridepublic boolean verify(String string, SSLSession ssls) {return true;}});CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();factory.setHttpClient(httpClient);REST_TEMPLATE = new RestTemplate(factory);// 解决中文乱码问题REST_TEMPLATE.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));}public static RestTemplate getRestTemplate() {return REST_TEMPLATE;}/*** @param url    请求完整地址* @param method 请求方式* @param param  请求参数* @param cls    返回类型class* @param <T>    泛型* @return*/public static <T> T exchange(String url, HttpMethod method, Map param, Class<T> cls) {HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");return exchange(url, method, headers, param, cls);}public static <T> T exchange(String url, HttpMethod method, HttpHeaders headers, Map param, Class<T> cls) {String jsonMap = "";if (headers == null) {headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");}HttpEntity formEntity = new HttpEntity(param, headers);ResponseEntity<T> result = REST_TEMPLATE.exchange(url, method, formEntity, cls);logger.info("【Info-Http】Request:" + url + "--|--" + JSON.toJSONString(param) + "--|--Result:" + JSON.toJSONString(result));return result.getBody();}public static String exchange(String url, HttpMethod method, Map param) {HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");HttpEntity formEntity = new HttpEntity(param, headers);ResponseEntity<String> result = REST_TEMPLATE.exchange(url, method, formEntity, String.class);return result.getBody();}/*** 跳过证书效验的sslcontext** @return* @throws Exception*/private static SSLContext createIgnoreVerifySSL() {try {SSLContext sc = SSLContext.getInstance("TLS");// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法X509TrustManager trustManager = new X509TrustManager() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}};sc.init(null, new TrustManager[]{trustManager}, null);return sc;} catch (Exception e) {log.info("建立 初始化异常");throw new RuntimeException();}}

方式三:使用Feign进行调用
1:主启动类添加
启动类上加上@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
@ComponentScan(basePackages = {"com.xx.mp", "com.ap.*" ,"com.xdp.*"})
public class XxApplication {public static void main(String[] args) {SpringApplication.run(XxApplication .class, args);}}

2:此处编写接口模拟外部接口供feign调用外部接口方式使用
定义controller

@Autowired
PrintService printService;@PostMapping("/outSide")
public String test(@RequestBody TestDto testDto) {return printService.print(testDto);
}

定义service

@Service
public interface PrintService {public String print(TestDto testDto);
}

定义serviceImpl

public class PrintServiceImpl implements PrintService {@Overridepublic String print(TestDto testDto) {return "模拟外部系统的接口功能"+testDto.getId();}
}

构建Feigin的Service
定义service

//此处name需要设置不为空,url需要在.properties中设置
@Service
@FeignClient(url = "${outSide.url}", name = "service2")
public interface FeignService2 {@RequestMapping(value = "/custom/outSide", method = RequestMethod.POST)@ResponseBodypublic String getMessage(@Valid @RequestBody TestDto testDto);
}

定义controller

@Autowired
FeignService2 feignService2;
//测试feign调用外部接口入口
@PostMapping("/test2")
public String test2(@RequestBody TestDto testDto) {return feignService2.getMessage(testDto);
}

添加Header解决方法
将token等信息放入Feign请求头中,主要通过重写RequestInterceptor的apply方法实现
定义config

@Configuration
public class FeignConfig implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//添加tokenrequestTemplate.header("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ");}
}

以上的是SpringBoot之远程调用的三大方式 若需完整代码 可识别二维码后 给您发代码。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…

第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作

第四十二天 一、PHP-MYSQL-SQL注入-常规查询 1.PHP-MYSQL-Web组成架构 MySQL(统一管理) ​ root&#xff08;自带默认&#xff09; ​ 网站A testA ​ 网站B testB MySQL(一对一管理) ​ testA用户 ​ 网站A testA ​ testB用户 ​ 网站B testB access无数据库用户 m…

三勾软件 / 三勾点餐系统门店系统,java+springboot+vue3

项目介绍 三勾点餐系统基于javaspringbootelement-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 在…

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境&#xff1a; 负载调度器&#xff1a;配置双网卡 内网&#xff1a;172.168.1.11(ens33) 外网卡&#xff1a;12.0.0.1(ens37)二台WEB服务器集群池&#xff1a;172.168.1.12、172.168.1.13 一台NFS共享服务器&#xff1a;172.168.1.14客户端&#xff…

Android的NDK开发中Cmake报缺少对应的x86的so文件

需要实现一个串口操作的命令。 供应商提供了2个so文件。 分别是 armeabi-v7a 和 arm64-v8a 添加到对应的cpp下。 在CMakeLists.txt里添加so文件 # 添加预编译的库 add_library(libxxx SHARED IMPORTED)# 设置库的路径 set_target_properties(libxxx PROPERTIES IMPORTED_…

springboot和html学院教务管理系统

端口号根据你实际运行程序的端口号来 访问地址&#xff1a;localhost:8080 学生 : student1 123456 管理员&#xff1a;admin 123456 老师&#xff1a;2020001 123456 sys_user 表是账号和密码

隔离流量优化网络传输

不要将长流和短突发流(或者大象流和老鼠流)混部在一起&#xff0c;我建议用切片或虚通道将它们在全链路范围彻底隔离&#xff0c;而不仅仅在交换机上配合着大肆宣讲的高端包分类算法配置一些排队调度。 也不必扯泊松到达&#xff0c;帕累托分布&#xff0c;这些概念在论文建模…

Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗

Flutter笔记 Widgets Easier组件库&#xff08;13&#xff09;使用底部弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

使用HashMap实现,对一个字符集进行哈夫曼编码

最终达到的效果: 调用一个类 class HuffmanCodin{.....} 使用类中的静态方法&#xff0c;获取哈夫曼编码&#xff1a; 事前准备——哈夫曼树的节点定义 class Node implements Comparable<Node> {int weight;//权重Node left;Node right;char ch;//关键字&#xff0c…

管理学SCI期刊,中科院4区,审稿快易录用,性价比超高!

一、期刊名称 Central European Journal of Operations Research 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;管理学 影响因子&#xff1a;1.7 中科院分区&#xff1a;4区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需…

人大金仓报The connection attempt failed.Reason:Connection reset解决办法

在连接人大京仓数据库 的时候报下面的错误 解决办法&#xff1a; 更换这里的IP地址就行&#xff0c;不要用127.0.0.1&#xff0c;然后就可以了

24.c++异常(异常的抛出和捕获、异常的重新抛出、抛出异常对象、抛出派生类对象、异常规范)

1.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统…

vscode的git插件使用教程

虽然git的命令我没有滚瓜烂熟&#xff0c;但vscode的git插件是尊嘟很好用啊&#xff0c;都被我用烂了。在网上看见一个讲的很不错的插件教程。借鉴一下。并在一些地方用块引用进行了补充说明&#xff01; 跳过了vscode安装过程。 克隆GitHub中的存储库&#xff1a; 1、复制Gi…

ai智能机器人电销的发展现状如何?

在移动互联网时代&#xff0c;人们对于营销的需求越来越高&#xff0c;而传统的营销方式已经无法满足人们的需求。下面我们来看看智能机器人电销的发展现状如何&#xff1f; 智能机器人电销作为一种全新的营销方式&#xff0c;正在迅速崛起。据市场机构统计&#xff0c;未来几…

C语言中的关键字static和extern

Hello,亲爱的小伙伴们&#xff0c;我又来了&#xff0c;上一期作者菌讲解了C语言中函数的知识点&#xff0c;得到了很好的反馈&#xff0c;这里作者菌感谢每一个至此我的小伙伴&#xff01;&#xff01;今天作者菌又来补充一些很有用的知识&#xff0c;感兴趣的uu们不要吝啬手中…

HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架

网页基本信息 DOCTYPE是设置使用什么规范&#xff0c;网页整个信息都在html标签中&#xff0c;head标签里包含字符集设置&#xff0c;网页介绍等信息&#xff0c;title标签是网页的名称&#xff0c;网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…

UE进阶篇四:多语言本地化

多语言 1、创建字符串表格&#xff1a;可以通过导入/导出CSV文件编辑或者编辑器直接编辑 2、工具 -> 本地化控制板 收集引擎中文本 3、添加新语言, 导出 .po文件&#xff0c;文本编辑也可直接编辑器编辑 4、使用方法 4.1 FText直接添加本地化 4.2 蓝图调用 4.3 C调用 5、…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…

(一)Linux的vim编辑器的使用

一.vim编辑器 Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。 二…

活动倒计时!四城再度联动,盘古信息与您相约上海|重庆|东莞|合肥

五月&#xff0c;是生命的复苏季&#xff0c;是希望的播种月。在这个充满活力的时节&#xff0c;盘古信息将在上海、重庆、东莞、合肥四地盛大举办四场精彩纷呈的活动。届时&#xff0c;我们将呈现一系列精心打造的工业软件产品及解决方案&#xff0c;带您领略制造业数字化转型…