Spring Boot 调用外部接口的 3 种方式,还有谁不会?!

点击关注公众号,Java干货及时送达3c1a9f7282617c2f9b7ba927a6352bdf.png

3dddb15a385c95138fc469c995b4bff7.png 国内最强微服务框架,没有之一!

6caeaf852fec70440668ed24afc3fdb1.png 几乎覆盖 Spring Boot 所有操作!

29cfc0960eac16e8b540b5a372a7b943.png 2023 全新 Java 面试题(2500+)

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<String,Object> 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();// 要调用的接口urlString 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请求

提供了getForObjectgetForEntity两种方式,其中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内容进行对象转换,实现请求直接返回包装好的对象内容。

另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

Post 请求

Post请求提供有postForEntitypostForObjectpostForLocation三种方式,其中每种方式都有三种方法,下面介绍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<String, Object> map = getMap(documentId);String jsonStr = JSON.toJSONString(map);//创建请求体并添加数据HttpEntity<Map> httpEntity = new HttpEntity<Map>(map, httpHeaders);String url = "http://39.103.201.110:30661/xdap-open/open/process/v1/submit";ResponseEntity<String> forEntity = restTemplate.postForEntity(url,httpEntity,String.class);//此处三个参数分别是请求地址、请求体以及返回参数类型return forEntity.toString();
}

4、方式三:使用Feign进行消费

在maven项目中添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId><version>1.2.2.RELEASE</version>
</dependency>

启动类上加上@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

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

postman测试

fc8591d4bfbdfdc6136cda7793ed13ee.png

此处因为我使用了所在项目,所以需要添加一定的请求头等信息,关于Feign的请求头添加也会在后续补充。

补充如下:

添加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");}
}

定义service

@Service
@FeignClient(url = "${outSide.url}",name = "feignServer", configuration = FeignDemoConfig.class)
public interface TokenDemoClient {@RequestMapping(value = "/custom/outSideAddToken", method = RequestMethod.POST)@ResponseBodypublic 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


如果你想系统学习 Spring Boot,推荐下我的《Spring Boot 核心技术课》,基于最新 3.x 版本,几乎覆盖 Spring Boot 所有核心知识点,一次付费,永久学习…

感兴趣的扫码联系订阅学习:

500f64f783aa7a6cfa96552fe4ddd8d8.png

想试看/预览的加R哥微信哈

3ecc721d15bf862fce9aaaa49bbc10f6.jpeg

加微信请备注:399

End

b2244b6592ef7e2bd58cb09e93ec8edf.png 国内最强微服务框架,没有之一!

20acf058c2294801f19aca863b319f14.png 几乎涵盖 Spring Boot 所有操作!

577866fe5edd390699fbe4f12deb2f0f.png 用上 ChatGPT 啦,强的离谱!

bb0ed1b1b8ac810890e0e2d6dbff7b58.png ChatGPT 视频课程来了,完全免费!

7fbe11cce0f33ca453d81a137c984184.png Java 20 正式发布,超神了。。

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

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

相关文章

通信云服务成互联网基石,「IM一哥」融云是怎么炼成的?

疫情阴霾散去&#xff0c;互联网行业呈现出了强劲复苏的势头&#xff0c;暖意也被传递到了产业链各环节&#xff0c;比如互联网通信云市场。艾瑞日前发布的《2023年全球互联网通信云行业研究报告》显示&#xff0c;2021年全球互联网通信云市场规模达到53亿元&#xff0c;同比增…

SpringBoot 调用外部接口的三种方式

1、简介 SpringBoot不仅继承了Spring框架原有的优秀特性&#xff0c;而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中&#xff0c;存在着本模块的代码需要访问外面模块接口&#xff0c;或外部url链接的需求, 比如在apaas开发过程中需…

Spring Boot 接口加解密,新姿势!

点击关注公众号&#xff0c;Java干货及时送达 学习 Spring Cloud 微服务的正确姿势&#xff01; 用上 ChatGPT 啦&#xff0c;强的离谱&#xff01; 博客园在绝境求生。。 1. 介绍 在我们日常的Java开发中&#xff0c;免不了和其他系统的业务交互&#xff0c;或者微服务之间的接…

Java第九次笔记---常用API(String、ArrayList)

目录 前言 一、String 1.1String类概述 78 1.2String类创建对象的2种方式 79 1.3String类常见面试题 80 1.4字符串的比较 1.5String类常用API-遍历、替换、截取、分割操作 81 1.5字符串案例操作 82 案例一、String类开发验证码功能 案例二、模拟用户登陆功能 案例三&…

完整且详细的Yolov8复现+训练自己的数据集

Yolov8 的源代码下载&#xff1a;ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > CoreML > TFLite (github.com)https://github.com/ultralytics/ultralytics Yolov8的权重下载&#xff1a;Releases ultralytics/assets GitHubUltralyt…

PHP伪协议精讲(文件包含漏洞)

1、什么是PHP伪协议PHP伪协议PHP伪协议 PHP伪协议事实上就是支持的协议与封装协议&#xff0c;简单来说就是php定义的一种特殊访问资源的方法&#xff0c;在web渗透漏洞利用中常用于配合文件配合进行web攻击&#xff0c;查询到网站中隐藏的机密文件&#xff0c;造成敏感信息泄露…

聊天挂机脚本

一款多达几十个聊天挂机脚本&#xff0c;喜欢的可以加Q裙交流 379---354---178 aput-object v6, v4, v5const/4 v5, 0x2const/4 v6, 0x5new-array v6, v6, [Ljava/lang/Object;const/4 v7, 0x0const-string v8, "回复"aput-object v8, v6, v7const/4 v7, 0x1const-st…

融云 CTO 岑裕受邀出席亚马逊云科技「出海日」论坛

&#xff08;点击购买《社交泛娱乐出海作战地图》&#xff09; 6 月 9 日&#xff0c;亚马逊云科技主办的“潮向新世界”出海日活动在深圳举行&#xff0c;融云作为领军出海服务企业受邀出席。关注【融云全球互联网通信云】了解更多 在现场展位&#xff0c;融云的一站式全生态…

赫拉利x本吉奥最新对谈:AI革命会和工业革命一样,带来新的帝国和数字殖民...

来源&#xff1a;Web3天空之城 作者&#xff1a;城主 编辑&#xff1a;腾讯新闻 郝博阳 编者导语 在过去一段时间内&#xff0c;我们听到了辛顿对AI发展的忧虑和杨立昆对AI影响一贯的乐观主义发言。但同为AI三巨头之一的约书亚本吉奥虽然一早就通过签署暂停AI宣言表达了他对AI…

BFT最前线丨百度地图加入文心交通大模型和生成式 AI ;深圳第一家AI独角兽云天励飞,市值近400亿;斯坦福大学发布开源机械臂

BFT机器人 01 百度地图加入文心交通大模型和生成式 AI 日前&#xff0c;百度地图V18版本正式官宣发布文心交通大模型和生成式AI作为底层支撑&#xff0c;成为“人工智能新地图”&#xff0c;全新升级的车道导航&#xff0c;全城市范围、全驾车过程提供三维动态高精指引复杂路口…

聚观早报 | OpenAI 没有上市计划;马斯克称未来房价下跌将加速

今日要闻&#xff1a;OpenAI 没有上市计划&#xff1b;马斯克称未来房价下跌将加速&#xff1b;Coinbase被SEC起诉&#xff0c;股价闪崩&#xff1b;库克&#xff1a;苹果正密切关注ChatGPT等&#xff1b;推特正致力于开发视频直播产品 OpenAI没有上市计划 当地时间周二&…

替代 MySQL 半同步复制,Meta技术团队推出 MySQL Raft 共识引擎

MySQL Raft是MySQL数据库中一种基于Raft协议的分布式一致性复制机制。近日&#xff0c;Meta技术团队分享了他们基于Raft协议在数据库基础设施方面的实践与创新&#xff0c;并打算取代当下使用的MySQL半同步数据库&#xff08;原文是用semisynchronous databases&#xff0c;责编…

【全栈第三课】通过ChatGPT快速入门NodeJS

前言 往期全栈课程&#xff1a; Vue从入门到精通 微信小程序从入门到精通 Node.js基础 简介 Node.js是什么&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O的模型&#xff0c;使其轻量又高效。Node.js …

听歌识曲--用python实现一个音乐检索器的功能

作者&#xff1a;唯心不易 字体&#xff1a;[增加 减小] 类型&#xff1a;转载 时间&#xff1a;2016-11-15 我要评论 本篇文章中主要介绍了用python实现一个音乐检索器&#xff0c;类似于QQ音乐的摇一摇识曲&#xff0c;有兴趣的同学可以了解一下。 听歌识曲&#xff0c;顾名思…

教你如何用Python抓取QQ音乐歌单及分析

学了python也有一段时间了&#xff0c;对于爬虫&#xff0c;后端的框架也有一些了解&#xff0c;但是都是在学习的时候跟着别人写的&#xff0c;感觉都不是自己的知识一样。我去年就给网易云音乐提了一个建议&#xff0c;就是通过播放量或者一个受欢迎程度来排序&#xff0c;然…

用python爬取音乐APP歌单

这篇文章&#xff0c;我们就来讲讲怎样爬取歌单&#xff0c;并且播放量从高到低排列&#xff0c;下面是爬取结果 一 核心代码如下 1.需要导入的包有 from urllib import parse from lxml import etree from urllib3 import disable_warnings import requests2.设置请求头部信息…

这几款音乐人必备的软件,你了解吗?

近几年随着各种关于音乐的综艺节目和自媒体盛行&#xff0c;音乐变得更加贴近民众。除了歌手以外的&#xff0c;音乐生产工作中的其他角色&#xff0c;例如编曲师、混音师、母带师等也渐渐走进大众的视野。 EarMaster&#xff1a;souurl.cn/b6rSSt Guitar Pro&#xff1a;sou…

某某星图sign参数解密分析

​ 大家好&#xff0c;我是TheWeiJun&#xff0c;欢迎来到我的公众号。今天给大家带来星图sign参数的解密分析&#xff0c;希望大家能够喜欢。如果你觉得我的文章内容有用&#xff0c;记得点赞&#x1f44d;&#x1f3fb;关注&#xff01; 特别声明&#xff1a;本公众号文章…

苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

神经网络中的损失函数

在《神经网络中常见的激活函数》一文中对激活函数进行了回顾&#xff0c;下图是激活函数的一个子集—— 而在神经网络领域中的另一类重要的函数就是损失函数&#xff0c;那么&#xff0c;什么是损失函数呢&#xff1f; 损失函数是将随机事件或其有关随机变量的取值映射为非负实…