最新要闻
- 天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
- 环球简讯:高温天气来了,这份权益保护指南请收好
- AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
- 北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
- 在拳头中国工作有多爽?上班随时打游戏 老板不能打断
- 男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
- 【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
- 篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
- 全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
- 全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
- 端午节后连上6天班 专家称调休多上一天班提高不了效率
- 环球新资讯:杭州一男子绿化带内迷路四天三夜:吃野花喝露水求生
- 你相信光吗?FF91交付推迟 贾跃亭激情发文回应:加速中国落地等_世界观察
- AI化身“印钞机”!扎克伯格等4位富豪因其暴赚10000亿_环球快看
- 湖北省商务厅第七届中俄博览会出访行程公布
- 每日看点!安徽35岁女子在上海相亲,被62岁大爷相中,直言每月给30万零花钱
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Spring Boot 调用外部接口的 3 种方式,还有谁不会?!
1、简介
SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。
在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择
(资料图)
推荐一个开源免费的 Spring Boot 实战项目:
https://github.com/javastacks/spring-boot-best-practice
2、方式一:使用原始httpClient请求
/* * @description get方式获取入参,插入数据并发起流程 * @author lyx * @date 2022/8/24 16:05 * @params documentId * @return String *///@RequestMapping("/submit/{documentId}")public String submit1(@PathVariable String documentId) throws ParseException { //此处将要发送的数据转换为json格式字符串 Map map =task2Service.getMap(documentId); String jsonStr = JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES,SerializerFeature.QuoteFieldNames); JSONObject jsonObject = JSON.parseObject(jsonStr); JSONObject sr = task2Service.doPost(jsonObject); return sr.toString();}/* * @description 使用原生httpClient调用外部接口 * @author lyx * @date 2022/8/24 16:08 * @params date * @return JSONObject */public static JSONObject doPost(JSONObject date) { String assessToken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ"; CloseableHttpClient client = HttpClients.createDefault(); // 要调用的接口url String url = "http://39.103.201.110:30661 /xdap-open/open/process/v1/submit"; HttpPost post = new HttpPost(url); JSONObject jsonObject = null; try { //创建请求体并添加数据 StringEntity s = new StringEntity(date.toString()); //此处相当于在header里头添加content-type等参数 s.setContentType("application/json"); s.setContentEncoding("UTF-8"); post.setEntity(s); //此处相当于在Authorization里头添加Bear token参数信息 post.addHeader("Authorization", "Bearer " +assessToken); HttpResponse res = client.execute(post); String response1 = EntityUtils.toString(res.getEntity()); if (res.getStatusLine() .getStatusCode() == HttpStatus.SC_OK) { // 返回json格式: String result = EntityUtils.toString(res.getEntity()); jsonObject = JSONObject.parseObject(result); } } catch (Exception e) { throw new RuntimeException(e); } return jsonObject;}
3、方式二:使用RestTemplate方法
Spring-Boot开发中,RestTemplate
同样提供了对外访问的接口API,这里主要介绍Get和Post方法的使用。
Get请求
提供了getForObject
、getForEntity
两种方式,其中getForEntity
如下三种方法的实现:
Get--getForEntity
,存在以下两种方式重载
1.getForEntity(Stringurl,Class responseType,Object…urlVariables)2.getForEntity(URI url,Class responseType)
Get--getForEntity(URI url,Class responseType)
//该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK java.net包下的一个类,表示一个统一资源标识符(Uniform Resource Identifier)引用。参考如下:RestTemplate restTemplate=new RestTemplate();UriComponents uriComponents=UriComponentsBuilder.fromUriString("http://USER-SERVICE/user?name={name}").build().expand("dodo").encode();URI uri=uriComponents.toUri();ResponseEntityresponseEntity=restTemplate.getForEntity(uri,String.class).getBody();
Get--getForEntity(Stringurl,Class responseType,Object…urlVariables)
//该方法提供了三个参数,其中url为请求的地址,responseType为请求响应body的包装类型,urlVariables为url中的参数绑定,该方法的参考调用如下:// http://USER-SERVICE/user?name={name)RestTemplate restTemplate=new RestTemplate();Mapparams=new HashMap<>();params.put("name","dada"); //ResponseEntityresponseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);
Get--getForObject,存在以下三种方式重载
1.getForObject(String url,Class responseType,Object...urlVariables)2.getForObject(String url,Class responseType,Map urlVariables)3.getForObject(URI url,Class responseType)
getForObject方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor
对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。
Post 请求
Post请求提供有postForEntity
、postForObject
和postForLocation
三种方式,其中每种方式都有三种方法,下面介绍postForEntity
的使用方法。
Post--postForEntity,存在以下三种方式重载
1.postForEntity(String url,Object request,Class responseType,Object... uriVariables) 2.postForEntity(String url,Object request,Class responseType,Map uriVariables) 3.postForEntity(URI url,Object request,Class responseType)
如下仅演示第二种重载方式
/* * @description post方式获取入参,插入数据并发起流程 * @author lyx * @date 2022/8/24 16:07 * @params * @return */@PostMapping("/submit2")public Object insertFinanceCompensation(@RequestBody JSONObject jsonObject) { String documentId=jsonObject.get("documentId").toString(); return task2Service.submit(documentId);}/* * @description 使用restTimeplate调外部接口 * @author lyx * @date 2022/8/24 16:02 * @params documentId * @return String */public String submit(String documentId){ String assessToken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ"; RestTemplate restTemplate = new RestTemplate(); //创建请求头 HttpHeaders httpHeaders = new HttpHeaders(); //此处相当于在Authorization里头添加Bear token参数信息 httpHeaders.add(HttpHeaders.AUTHORIZATION, "Bearer " + assessToken); //此处相当于在header里头添加content-type等参数 httpHeaders.add(HttpHeaders.CONTENT_TYPE,"application/json"); Map map = getMap(documentId); String jsonStr = JSON.toJSONString(map); //创建请求体并添加数据 HttpEntity
4、方式三:使用Feign进行消费
在maven项目中添加依赖
org.springframework.cloud spring-cloud-starter-feign 1.2.2.RELEASE
启动类上加上@EnableFeignClients
@SpringBootApplication@EnableFeignClients@ComponentScan(basePackages = {"com.definesys.mpaas", "com.xdap.*" ,"com.xdap.*"})public class MobilecardApplication { public static void main(String[] args) { SpringApplication.run(MobilecardApplication.class, args); } }
此处编写接口模拟外部接口供feign调用外部接口方式使用
定义controller
@AutowiredPrintService printService;@PostMapping("/outSide")public String test(@RequestBody TestDto testDto) { return printService.print(testDto);}
定义service
@Servicepublic interface PrintService { public String print(TestDto testDto);}
定义serviceImpl
public class PrintServiceImpl implements PrintService { @Override public 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) @ResponseBody public String getMessage(@Valid @RequestBody TestDto testDto);}
定义controller
@AutowiredFeignService2 feignService2;//测试feign调用外部接口入口@PostMapping("/test2")public String test2(@RequestBody TestDto testDto) { return feignService2.getMessage(testDto);}
postman测试
此处因为我使用了所在项目,所以需要添加一定的请求头等信息,关于Feign的请求头添加也会在后续补充
补充如下:
添加Header解决方法
将token等信息放入Feign请求头中,主要通过重写RequestInterceptor
的apply方法实现
定义config
@Configurationpublic class FeignConfig implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { //添加token requestTemplate.header("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ"); }}
定义service
@Service@FeignClient(url = "${outSide.url}",name = "feignServer", configuration = FeignDemoConfig.class)public interface TokenDemoClient { @RequestMapping(value = "/custom/outSideAddToken", method = RequestMethod.POST) @ResponseBody public String getMessage(@Valid @RequestBody TestDto testDto);}
定义controller
//测试feign调用外部接口入口,加上token@PostMapping("/testToken")public String test4(@RequestBody TestDto testDto) { return tokenDemoClient.getMessage(testDto);}
版权声明:本文为CSDN博主「Chelsea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/Chelsea/article/details/126689495
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果
来源: Spring Boot 调用外部接口的 3 种方式,还有谁不会?!
世界讯息:如何做mysql调优?绝命7招,让慢SQL调优100倍
浅析GeoServer CVE-2023-25157 SQL注入_全球热消息
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
环球简讯:高温天气来了,这份权益保护指南请收好
AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
在拳头中国工作有多爽?上班随时打游戏 老板不能打断
男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
环球焦点!发力电子后视镜CMS,芯驿电子与映赛科技达成战略合作
债市日报:6月21日 天天速看
全球微动态丨【财经面对面】平安健康互联网医院院长杨昆:加快AI赋能 打造O2O医疗健康服务
【金融街发布】人民银行:深入推进金融系统审计整改工作
全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
端午节后连上6天班 专家称调休多上一天班提高不了效率
环球新资讯:杭州一男子绿化带内迷路四天三夜:吃野花喝露水求生
你相信光吗?FF91交付推迟 贾跃亭激情发文回应:加速中国落地等_世界观察
AI化身“印钞机”!扎克伯格等4位富豪因其暴赚10000亿_环球快看
湖北省商务厅第七届中俄博览会出访行程公布
MyBatis-Plus 实现动态字段排序|播资讯
环球热点评!【技术积累】数据结构中的基本概念【一】
多卡训练_环球热闻
快看点丨记录--新的HTML标签 :
每日看点!安徽35岁女子在上海相亲,被62岁大爷相中,直言每月给30万零花钱
什么是核心素养?
每日热门:空气循环扇和传统风扇怎么选?别再被商家忽悠了
印度德里地铁将支持手机二维码乘车 网友:遥遥领先 焦点关注
当前热文:马斯克又出惊人语录:做生意是为了促进和保护人类文明
苹果受益!国产手机在德国等欧洲市场没法卖了:诺基亚用专利封杀 世界百事通
焦点热议:腾讯《三体》编剧:奈飞版《三体》一集的预算能拍我们一整部 技术太落后
312斤女网红在减肥营离世,专家:减肥不当会闭经,每周减重不要多于1Kg-时快讯
不请自来!哪些猫咪品种经常光顾邻居家?_今日精选
环球微头条丨AI教你实现敏捷游戏自由,再也不用担心陷入瓶颈啦!
Linux Powershell 安装教程 天天快播报
C#语言async, await 简单介绍与实例(入门级) 当前聚焦
北向资金全天小幅净卖出6.41亿元 时讯
读懂“中文大脑”,破解阅读障碍
信用卡逾期收到律师函怎么办?信用卡逾期律师函来了后果严重吗?
新动态:彩票为什么不能网上卖_彩票为什么不能网上买
首款骁龙8 Gen2平板要来了:内置散热风扇 游戏神器|环球今头条
每日报道:AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款了
电池有缺陷被特斯拉踢出供应链?宁德时代辟谣:消息不实
宣告放弃LCD材料!三星、LG供应商默克集团全力研发MicroLED等新材料
天天速讯:高考查分遇上端午假期:31省成绩23日起陆续公布
台电P76t_台电p76v
红楼梦摘抄400字_红楼梦摘抄
【全球新视野】柔道著名运动员(郝义 柔道运动员)
五证一书指什么生肖(五证一书指什么)|世界最新
A股分红派息转增一览:43股今日股权登记
每日焦点!苹果或重新发明苹果汽车安全带:打造发光安全带扣
又瞎折腾!Windows 11将删除9个文件夹选项
帮人就是帮己!西南大学校长毕业寄语被狂赞:外卖别随意给差评 大胆扶摔倒老人_环球观焦点
keycloak~CountDownLatch在keycloak中的使用 资讯推荐
高精度离线免费 的C#文字识别PaddleOCR库|速递
环球快讯:星纪魅族官宣参展2023 MWC上海:Flyme Auto、魅族20系列重磅登场
每日热文:余承东大喜!工信部:支持L3级及更高级别自动驾驶功能商业化应用
鲜嫩入味 Q弹不柴:驰迈即时鸡胸肉50g*5袋9.9元_天天看点
全球时讯:《闪电侠》预示华纳影业面临巨大亏空
环球今热点:国服关停5个月后:成都猎人队宣布彻底退出《守望先锋》联赛
全球简讯:即视角|出海正当时:欧美、东南亚、中东、拉美市场观察
参展动态 | 璞华参展第九届中国(上海)国际技术进出口交易会-全球关注
国泰君安:5月挖机销量略超预期,静待下半年行业复苏
致命摇篮下载 1080p 下载 致命摇篮迅雷下载 全球微动态
【世界新视野】京雄大桥顺利合龙!京雄高速将于年内全线通车(图)
【快播报】印尼很快将不再出口原铜因希望从资源中寻求更多价值金十数据6月21日讯,印度尼西亚总统佐科当地时间周二表示,该国很快将不再出口原铜,因为这一金属将在国内
首销仅售32元:3DMark登陆Epic商店
国内油价冲破上调红线!端午节过后涨价可能性很大
笔记本存储“官方升级”谁最贵最坑?对比后揭晓答案 新资讯
免费玩!国产大作《仙剑奇侠传7》即将登陆XGP订阅服务-当前短讯
演员陈建斌多巴胺穿搭引热议 律师:AI换脸侵犯肖像权
全球热推荐:官宣!NBA历史第一高薪即将诞生,哈登交易方案,勇士3人离队
万能u盘低级格式化工具下载_u盘格式化工具下载-世界热推荐
关于在Redhat-7-linux-系统-Apache-2.4.6-版本上部署多个版本的yum仓库-的配置文件写法
【Java】使用 validation 完成自定义校验注解 今日热文
性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析|世界新视野
视频直播源码技术知识分享:连麦功能(一)
环球即时看!ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
北汽极狐成立法务部:200万粉丝知名汽车博主收到“告知函” 快资讯
中国首位!科学家付巧妹获联合国阿勒福赞奖-全球快播
226元大额券:361板鞋运动鞋休闲鞋74元抄底|全球百事通
离大谱!男子偷马路卖钱:把路分成小块去卖 天天时讯
3岁女童患罕见病 肚大如石鼓随时会“爆炸”:医生科普 续命针1次上万-环球快播
当前滚动:【后端面经-java】java线程池满的处理策略
Rust语言 - 接口设计的建议之受约束(Constrained)_天天最资讯
java~理解可重入锁 焦点速读
硬件博主自费实测5大旗舰手机信号:iPhone各种被狂虐
焦点热文:载亿万富翁观光潜艇失联 被曝用游戏手柄操控 专家:生还希望渺茫
电动汽车也能无线充电了:像手机一样简单 超大充电板长这模样
全球热议:微软停止涨薪影响明显:员工跳槽意愿上涨23%
11499元 三星首款5K专业显示器上架:配可拆卸4K摄像头
环球今日讯!java~字节码操作ASM
班主任和家长扮恐龙接中考生 现场让网友看笑:可爱的显眼包 全球信息
史上最深深海救援!观光潜艇失联:搜救无进展 氧气剩不多、或卡残骸中|全球讯息
公募基金派发约八百亿元“红包雨” 债基占比超八成
俄妹COS《塞尔达》公主火了 性感美艳:欧美曾呼吁塞尔达公主应黑人|时快讯
环球热文:破75%了!理想汽车家用交流充电桩安装率遥遥领先