Spring Boot进阶(65):解锁神技!让Spring Boot与外部API打通的10种方式

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!

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源文章来源地址https://uudwc.com/A/JwdrP

原文地址:https://blog.csdn.net/weixin_43970743/article/details/132484180

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月15日 04:07
python遗传算法之单/多目标规划问题
下一篇 2023年09月15日 04:08