👨🎓作者:bug菌
✏️博客:CSDN、掘金、InfoQ、51CTO等
🎉简介:CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。
🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。
本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
1. 前言🔥
在当今互联网时代,API已经成为了软件开发和数据交互的重要手段。有时,我们需要调用外部API以访问某些远程服务或获取某些数据。然而,API的调用方式并不限于我们所熟知的GET和POST请求,还有其他一些不太为人所知的方式。
本文将介绍10种你可能不知道的调用外部API的方式,有些方式可能并不适用于所有API,但了解这些方式可以让你在面对不同的API时更具灵活性。
那么,好戏即将开场,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!
2. 环境说明🔥
本地的开发环境:
- 开发工具:IDEA 2021.3
- JDK版本: JDK 1.8
- Spring Boot版本:2.3.1 RELEASE
- Maven版本:3.8.2
3. 搭建Spring Boot应用🔥
首先,我们先创建个基础的Spring Boot项目,如果还不会点这里,此处就不详细赘述啦。
4. 10种调用外部API的方式🔥
在本文中,我们将介绍10种调用外部API的方式,包括但不限于:使用HTTP协议以外的协议、使用WebSocket协议、使用TCP/IP协议、使用UDP协议、使用FTP协议、使用SMTP协议、使用IMAP协议、使用POP3协议、使用SOAP协议和使用REST协议。这些方式各有不同的优点和适用场景,了解它们可以为你在开发中提供更多的选择,接下来我将逐一进行介绍。
4.1 使用RestTemplate发送HTTP请求
RestTemplate 是 Spring 框架提供的一个 HTTP 客户端工具,可以用来调用 RESTful 接口。RestTemplate 的几个常用方法:getForObject()、getForEntity()、postForObject()、postForEntity()。其中,getForObject() 和 getForEntity() 方法可以用来发送 GET 请求。
方法描述:使用 RestTemplate 进行 GET 请求需要创建 RestTemplate 实例,并且调用 getForObject() 或 getForEntity() 方法。getForObject() 方法返回响应主体对象,getForEntity() 方法返回 ResponseEntity 对象,包含响应状态码和响应头信息。
具体代码实现如下:
// 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
// 使用
@RestController
public class ExampleController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/example")
public String example() {
String url = "http://example.com/api/data";
String response = restTemplate.getForObject(url, String.class);
return response;
}
}
代码分析:首先创建一个RestTemplate对象,然后使用该对象发送GET请求,获取返回结果。
4.2 使用FeignClient调用
Feign 是一个声明式的 HTTP 客户端工具,可以用来调用 RESTful 接口,支持多种 HTTP 客户端实现,如 OkHttp、HttpClient、RestTemplate 等。使用 Feign 可以简化 HTTP 客户端的调用。
方法描述:使用 Feign 进行 GET 请求需要定义一个接口,并使用注解指定接口的 URL 地址和请求参数,然后使用 Feign 实例调用接口方法,并获取响应数据。
示例代码:
// 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
// 使用
@FeignClient(name = "example", url = "http://example.com")
public interface ExampleClient {
@GetMapping("/api/data")
String getData();
}
@RestController
public class ExampleController {
@Autowired
private ExampleClient exampleClient;
@GetMapping("/example")
public String example() {
return exampleClient.getData();
}
}
代码分析:通过使用@FeignClient注解声明一个Feign客户端,并定义接口中的HTTP请求方法,然后在需要使用该接口的地方注入该接口实例即可。
4.3 使用WebClient调用
WebClient 是 Spring 5 引入的一个非阻塞式的 HTTP 客户端工具,可以用来调用 RESTful 接口。WebClient 的 get() 方法可以用来发送 GET 请求。
方法描述:使用 WebClient 进行 GET 请求需要创建 WebClient 实例,调用 get() 方法,设置请求参数和请求头信息,发送请求并获取响应数据。
示例代码:
// 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
// 使用
@Bean
public WebClient webClient() {
return WebClient.builder()
.baseUrl("http://example.com")
.build();
}
@RestController
public class ExampleController {
@Autowired
private WebClient webClient;
@GetMapping("/example")
public Mono<String> example() {
return webClient.get()
.uri("/api/data")
.retrieve()
.bodyToMono(String.class);
}
}
代码分析:首先创建一个WebClient对象,然后使用该对象发送GET请求,获取返回结果。
4.4 使用Retrofit调用
Retrofit 是一个基于 OkHttp 的声明式的 HTTP 客户端工具,可以用来调用 RESTful 接口。使用 Retrofit 可以简化 HTTP 客户端的调用。
方法描述:使用 Retrofit 进行 GET 请求需要定义一个接口,并使用注解指定接口的 URL 地址和请求参数,然后使用 Retrofit 实例调用接口方法,并获取响应数据。
示例代码:
// 引入依赖
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
</dependency>
// 使用
public interface ExampleService {
@GET("/api/data")
Call<String> getData();
}
@RestController
public class ExampleController {
@Autowired
private Retrofit retrofit;
@GetMapping("/example")
public String example() throws IOException {
ExampleService service = retrofit.create(ExampleService.class);
Call<String> call = service.getData();
Response<String> response = call.execute();
return response.body();
}
}
代码分析:首先创建一个Retrofit对象,然后使用该对象创建接口的实例,然后调用接口中的方法,获取返回结果。
4.5 使用HttpURLConnection调用
HttpURLConnection 是 Java 自带的一个 HTTP 客户端工具,可以发送 HTTP 请求和接收 HTTP 响应。使用 HttpURLConnection 可以简单地发送 GET 请求。
方法描述:使用 HttpURLConnection 进行 GET 请求需要创建 HttpURLConnection 实例,设置请求方式和请求参数,然后获取响应数据。
示例代码:
// 使用
@RestController
public class ExampleController {
@GetMapping("/example")
public String example() throws IOException {
URL url = new URL("http://example.com/api/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
return sb.toString();
}
}
代码分析:首先创建一个URL对象,然后使用该对象打开一个连接,设置请求方法为GET,获取返回结果。
4.6 使用Apache HttpClient调用
Apache HttpClient 是 Apache 提供的一个 HTTP 客户端库,它提供了丰富的 API,可以很方便地发送 HTTP 请求和获取 HTTP 响应。具体代码实现如下:
// 引入依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
// 使用
@RestController
public class ExampleController {
@GetMapping("/example")
public String example() throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://example.com/api/data");
CloseableHttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
response.close();
httpClient.close();
return result;
}
}
我们首先创建一个CloseableHttpClient对象。然后,我们使用HttpGet类创建一个GET请求,并指定请求的URL。最后,我们使用CloseableHttpClient对象的execute方法来触发请求,并使用EntityUtils类的toString方法将响应体转换为String类型。
4.7 使用OkHttp调用
OkHttp 是一个开源的 HTTP 客户端工具,支持 HTTP/2 和 SPDY,并提供了简单易用的 API。使用 OkHttp 可以发送 GET 请求。
方法描述:使用 OkHttp 进行 GET 请求需要创建 OkHttpClient 实例,创建 Request 对象,设置请求参数和请求头信息,发送请求并获取响应数据,最后,使用OkHttpClient对象的newCall方法来触发请求,并将响应体转换为String类型。
示例代码:
// 引入依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
// 使用
@RestController
public class ExampleController {
@GetMapping("/example")
public String example() throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://example.com/api/data")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}
代码分析:首先创建一个OkHttpClient对象,然后使用该对象发送GET请求,获取返回结果。
4.8 使用AsyncHttpClient调用
AsyncHttpClient 是一个 Java 异步的 HTTP 客户端工具,使用 Netty 进行底层通信。使用 AsyncHttpClient 可以发送 GET 请求。
方法描述:使用 AsyncHttpClient 进行 GET 请求需要创建 AsyncHttpClient 实例,创建 RequestBuilder 对象,设置请求参数和请求头信息,发送请求并获取响应数据。
示例代码:
// 引入依赖
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.12.3</version>
</dependency>
// 使用
@RestController
public class ExampleController {
@GetMapping("/example")
public CompletableFuture<String> example() {
AsyncHttpClient client = new DefaultAsyncHttpClient();
CompletableFuture<String> future = client.prepareGet("http://example.com/api/data")
.execute()
.toCompletableFuture()
.thenApply(Response::getResponseBody);
return future;
}
}
代码分析:首先创建一个AsyncHttpClient对象,然后使用该对象发送GET请求,获取返回结果。
4.9 使用URLConnection调用
URLConnection 是 Java 中的一个 HTTP 客户端类,它可以用来发送 HTTP 请求和获取 HTTP 响应。
我们首先创建了一个URL对象,并指定请求的URL。然后,我们使用URL对象的openConnection方法创建一个HttpURLConnection对象,并设置请求方法。最后,我们获取响应流,将其转换为String类型。
具体代码实现如下:
// 使用
@RestController
public class ExampleController {
@GetMapping("/example")
public String example() throws IOException {
URL url = new URL("http://example.com/api/data");
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
return sb.toString();
}
}
4.10. 使用JAX-RS调用
JAX-RS 是 Java EE 规范中定义的一组 API,可以用来开发 RESTful 服务和客户端。使用 JAX-RS 客户端可以发送 GET 请求。
方法描述:使用 JAX-RS 客户端进行 GET 请求需要创建 Client 实例,创建 WebTarget 对象,设置请求参数和请求头信息,发送请求并获取响应数据。
示例代码:
// 引入依赖
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1</version>
</dependency>
// 使用
@Path("/example")
public class ExampleResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String example() {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://example.com/api/data");
String response = target.request(MediaType.TEXT_PLAIN).get(String.class);
return response;
}
}
代码分析:首先创建一个Client对象,然后使用该对象创建WebTarget对象,调用request方法获取请求对象,发送GET请求,获取返回结果。
小结
以上10种调用API的方式各有优缺点,不同的 API 技术适用于不同的场景,根据项目需求进行选择是非常重要的。同时,无论采用哪种方式,都需要注意接口的安全性和稳定性,以避免数据泄露和系统崩溃等问题。除了上述方式,还有很多其他的 API 调用方式,等待同学们一起来挖掘来创造。
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
热文推荐
为了便于同学快速定位文章学习,熬夜几天终于整理出了【基础篇】及【进阶篇】专栏的文章及有效地址,同学们敬请吩咐bug菌吧。
目前基础篇已完结【130】 篇+,进阶篇已完结【80】篇+,两专栏都在持续更新中;生命不息,更新不止,加油卷起来吧,同学们。部分文章总结如下:
🌟Spring Boot【基础篇】
Spring Boot入门(01):Spring Boot的奋斗成长史
Spring Boot入门(02):快速开发环境搭建和项目启动
Spring Boot入门(03): yaml、properties配置文件介绍及使用
Spring Boot入门(06):Spring Boot常用注解大全
Spring Boot入门(07):整合 MySQL 和 Druid数据源(两万字教学)
Spring Boot入门(08):整合Mybatis访问MySQL实现增删改查
Spring Boot入门(09):使用MyBatis的XML配置方式访问MySQL实现增删改查
Spring Boot入门(10): mybatis之xml映射文件>、<=等特殊符号写法
Spring Boot入门(11):Spring Boot 整合 JPA
Spring Boot入门(12):整合Mybatis-Plus mybatis-plus实现接口增删改查
Spring Boot入门(13): Mybatis-Plus之条件构造器使用手册
Spring Boot入门(14): mybatis-plus之如何自定义sql
Spring Boot入门(15):Spring Boot 整合 MyBatis-Plus AutoGenerator 自动生成项目骨架代码
Spring Boot入门(16):Spring Boot整合Swagger-UI实现在线API文档
Spring Boot入门(17):Spring Boot整合Knife4j,美化强化丑陋的Swagger
Spring Boot入门(18):Spring Boot静态资源映射
Spring Boot入门(19):Spring Boot 整合 Thymeleaf 模板引擎,开发Web页面
Spring Boot入门(20):实现多数据源配置,开箱即用
Spring Boot入门(21):整合Log4j2以及配置详解
Spring Boot入门(22):整合LogBack 实现日志文件本地保存
Spring Boot入门(23):Spring Boot基于AOP拦截日志
Spring Boot入门(24):Spring Boot事务
Spring Boot入门(25):过滤器、拦截器、监听器对比及使用场景
Spring Boot入门(26):实现邮件发送简单邮件、附件邮件、嵌入资源(图片)邮件、模板邮件等
Spring Boot入门(30):Windows安装Redis客户端?你玩过么
... ...
若想学习更多,这边请👉👉👉《滚雪球学Spring Boot》👈👈👈
🌟Spring Boot【进阶篇】
Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由
Spring Boot进阶(02):使用Validation进行参数校验
Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充
Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页
Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务
Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端
Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出
Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出
Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出
Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件
Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?
Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?
Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?
Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你
Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息
Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?
Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息
Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?
Spring Boot进阶(19):Spring Boot 整合ElasticSearch
Spring Boot进阶(21):配置Undertow容器
Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析
Spring Boot进阶(24):如何快速实现多文件上传?
Spring Boot进阶(25):文件上传的单元测试怎么写?
Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学
Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)
Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存
Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示
Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示
... ...
若想学习更多,这边请👉👉👉《SpringBoot 进阶实战》 👈👈👈
若想系统完整的从0到1的学习,可以参考这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》,本专栏致力打造最硬核 Spring Boot 进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中。欢迎大家订阅持续学习。
在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??
本文涉及所有源代码,均已上传至GitHub开源,供同学们一对一参考。
同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。