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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: SpringBoot不仅继承了Spring框架原有的特性,还简化了应用搭建与开发流程。在SpringBoot项目中,有时需要访问外部接口或URL。本文介绍三种不使用Dubbo的方式:一是利用原生`httpClient`发起请求;二是使用`RestTemplate`,支持GET和POST请求,包括`getForEntity`、`getForObject`及`postForEntity`等方法;三是采用`Feign`客户端简化HTTP请求,需引入相关依赖并在启动类上启用Feign客户端。这三种方式均能有效实现对外部服务的调用。

1、简介

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

2、方式一:使用原始httpClient请求

vbnet

代码解读

复制代码

/* * @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();    // 要调用的接口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请求

提供了getForObjectgetForEntity两种方式,其中getForEntity如下三种方法的实现:

Get--getForEntity,存在以下两种方式重载

vbnet

代码解读

复制代码

1.getForEntity(Stringurl,Class responseType,Object…urlVariables)2.getForEntity(URI url,Class responseType)

Get--getForEntity(URI url,Class responseType)

vbnet

代码解读

复制代码

//该方法使用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)

ruby

代码解读

复制代码

//该方法提供了三个参数,其中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,存在以下三种方式重载

vbnet

代码解读

复制代码

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请求提供有postForEntitypostForObjectpostForLocation三种方式,其中每种方式都有三种方法,下面介绍postForEntity的使用方法。

Post--postForEntity,存在以下三种方式重载

vbnet

代码解读

复制代码

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)

如下仅演示第二种重载方式

vbnet

代码解读

复制代码

/* * @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项目中添加依赖

xml

代码解读

复制代码

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

启动类上加上@EnableFeignClients

less

代码解读

复制代码

@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

less

代码解读

复制代码

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

定义service

java

代码解读

复制代码

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

定义serviceImpl

typescript

代码解读

复制代码

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

构建Feigin的Service

定义service

sql

代码解读

复制代码

//此处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

ruby

代码解读

复制代码

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

postman测试

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

补充如下:

添加Header解决方法

将token等信息放入Feign请求头中,主要通过重写RequestInterceptor的apply方法实现

定义config

typescript

代码解读

复制代码

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

定义service

less

代码解读

复制代码

@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

perl

代码解读

复制代码

//测试feign调用外部接口入口,加上token@PostMapping("/testToken")public String test4(@RequestBody TestDto testDto) 


转载来源:https://juejin.cn/post/7362847673772490761

相关文章
|
28天前
|
Java 开发者 Spring
精通SpringBoot:16个扩展接口精讲
【10月更文挑战第16天】 SpringBoot以其简化的配置和强大的扩展性,成为了Java开发者的首选框架之一。SpringBoot提供了一系列的扩展接口,使得开发者能够灵活地定制和扩展应用的行为。掌握这些扩展接口,能够帮助我们写出更加优雅和高效的代码。本文将详细介绍16个SpringBoot的扩展接口,并探讨它们在实际开发中的应用。
42 1
|
2月前
|
存储 安全 Java
|
2月前
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
2月前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
54 0
|
3月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
3月前
|
存储 前端开发 Java
springboot文件上传和下载接口的简单思路
本文介绍了在Spring Boot中实现文件上传和下载接口的简单思路。文件上传通过`MultipartFile`对象获取前端传递的文件并存储,返回对外访问路径;文件下载通过文件的uuid名称读取文件,并通过流的方式输出,实现文件下载功能。
springboot文件上传和下载接口的简单思路
|
3月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
375 6
|
2月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
41 0
|
3月前
|
Java 网络架构
springboot配合thymeleaf,调用接口不跳转页面只显示文本
springboot配合thymeleaf,调用接口不跳转页面只显示文本
133 0
|
4月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
1364 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅