likes
comments
collection
share

解锁神技!让Spring Boot与外部API打通的10种方式!

作者站长头像
站长
· 阅读数 20

🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升。

本专栏致力打造最硬核 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!! 

解锁神技!让Spring Boot与外部API打通的10种方式!

2. 环境说明🔥

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 搭建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. 热文推荐💭

在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??

本文涉及所有源代码,均已上传至github开源,供同学们一对一参考 GitHub传送门

同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

6. 文末💭

解锁神技!让Spring Boot与外部API打通的10种方式!