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 调用方式,等待同学们一起来挖掘来创造。
5. 热文推荐?
滴~如下推荐【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进阶(20):配置Jetty容器
Spring Boot进阶(21):配置Undertow容器
Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析
Spring Boot进阶(23):实现文件上传
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 注解使用区别,实战演示
...
本项目源码地址:GitHub - luoyong0603/SpringBoot-demo: 该项目代码为《滚雪球学Spring Boot》《Spring Boot进阶实战》专栏知识点讲解案例及相关源码,开源给同学们参考。
6. 文末?
如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。
如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。
本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star?,想体验下被加Star的感jio,非常感谢 ❗
我是bug菌,一名想走?出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
文章来源:https://www.uudwc.com/A/JwdrP/
关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源文章来源地址https://www.uudwc.com/A/JwdrP/