SpringBoot:SpringBoot 调用第三方接口的几种方式

一、前言

**  在项目中调用第三方接口时,确实需要根据项目的技术栈、架构规范以及具体的业务需求来选择最适合的调用方式。比如:RESTful API调用、Feign声明式HTTP客户端、Apache HttpClient等调用方式,每种方式都有其适用场景和优势。下面我们就介绍几种调用第三方接口的实现方式以及代码示例。**

二、常见的调用方式

1. RESTful API调用

  适用场景:当第三方接口遵循RESTful设计风格时,通常使用HTTP客户端库(如OkHttp、Apache HttpClient等)来发送HTTP请求并接收响应。

优势

  通用性强:RESTful API基于HTTP协议,可以跨平台、跨语言调用。

  灵活性高:支持各种HTTP方法(GET、POST、PUT、DELETE等),可以满足不同的业务需求。

  易于测试:可以使用Postman、curl等工具进行接口测试。

  实现方式:使用HTTP客户端库构建请求,发送请求并处理响应。

2. Feign声明式HTTP客户端

**  适用场景**:在Spring Cloud等微服务架构中,Feign可以作为声明式HTTP客户端,简化HTTP请求的编写。

优势

  简化代码:通过注解的方式定义HTTP请求,减少模板代码。

  支持负载均衡:可以配合Ribbon等组件实现客户端负载均衡。

  易于集成:与Spring Cloud等框架集成良好,方便使用。

  实现方式:在Spring Boot项目中添加Feign依赖,使用注解定义HTTP请求,并通过注入的方式调用Feign客户端。

3. Apache HttpClient

适用场景:对于需要更精细控制HTTP请求和响应的场景,可以使用Apache HttpClient。

优势

  功能丰富:支持HTTP/1.1和HTTP/2,提供丰富的API来构建和发送HTTP请求。

  灵活性强:可以自定义请求头、请求体、连接池等参数。

  可扩展性好:支持插件式扩展,可以根据需要添加自定义功能。

  实现方式:使用HttpClientBuilder构建HttpClient实例,通过HttpClient实例发送HTTP请求并处理响应。

4. 其他方式

**  Spring的RestTemplate**:在Spring框架中,RestTemplate提供了简化的方式来调用RESTful服务。它内部封装了HttpClient,提供了更加简洁的API。

**  WebClient**:在Spring WebFlux中,WebClient是一个响应式、非阻塞的HTTP客户端,用于调用RESTful服务。

**  GraphQL客户端**:如果第三方接口支持GraphQL,可以使用GraphQL客户端库(如Apollo、Relay等)来调用。

三、SpringBoot 第三方接口调用示例

1. JDK HttpClient

**  自Java 11起,JDK自带了一个全新的HTTP客户端API,用于发送HTTP请求和接收HTTP响应。**

**  它提供了同步和异步的API,支持HTTP/1.1和HTTP/2,并且是基于CompletableFuture实现的异步操作。**

java 复制代码
import java.net.URI;  
import java.net.http.HttpClient;  
import java.net.http.HttpRequest;  
import java.net.http.HttpResponse;  
import java.net.http.HttpTimeoutException;  
  
public class JdkHttpClientTest {  

    public static void main(String[] args) {  
	
        HttpClient client = HttpClient.newHttpClient();  
		
        HttpRequest request = HttpRequest.newBuilder()  
                .uri(URI.create("https://123.com"))  
                .build();  
  
        try {  
		
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());  
			
            System.out.println(response.statusCode()); 
			
            System.out.println(response.body());  
			
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
		
    }  
}

2. Apache HttpClient

**  Apache HttpClient是一个功能丰富的HTTP客户端库,由Apache Software Foundation开发,广泛应用于各种Java项目中,用于发送HTTP请求和接收HTTP响应。**

java 复制代码
public class ApacheHttpClientTest {  

    public static void main(String[] args) {  
	
		HttpGet request = new HttpGet("https://1234.com");
		CloseableHttpClient client = HttpClients.custom().build(); 
  
        try {  
		
            HttpClientResponseHandler<String> responseHandler = new BasicHttpClientResponseHandler(); 
			
			String ret = client.execute(httpget, responseHandler) ;
			
			System.out.println(ret) ; 
			
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
		
    }  	 
    
}

3. OkHttp

**  OkHttp是一款由Square公司贡献的开源网络请求的轻量级框架,主要用于Android和Java应用。它作为现代HTTP客户端,具备高效、易用、功能强大的特点。**

java 复制代码
public void OkHttpClientTest() {
	// 1. 创建一个OkHttpClient实例  
	OkHttpClient client = new OkHttpClient();

	// 2. 创建一个Request对象  
	Request request = new Request.Builder().url("http://1234.com") // 设置请求的URL  
			.build();

	// 3. 发送请求并获取Response对象  
	try (Response response = client.newCall(request).execute()) {
		
		String responseBody = response.body().string();
		
		System.out.println(responseBody);
		
	} catch (IOException e) {
		e.printStackTrace();
	}
}

4. RestTemplate

**  RestTemplate是Spring框架中的一个类,它提供了一个高层次的RESTful web service客户端。**

**  它简化了与RESTful web services的集成,并提供了多种方法来发送HTTP请求和接收HTTP响应。**

java 复制代码
public class RestTemplateTest {  
    public static void main(String[] args) {  
        RestTemplate restTemplate = new RestTemplate();  
  
        String response = restTemplate.getForObject("https://1234.com", String.class);  
		
        System.out.println(response);  
    }  
}

5. WebClient

**  WebClient 是Spring WebFlux提供的一个非阻塞的、响应式的Web客户端,用于发起HTTP请求。它特别适用于响应式编程模型和Spring WebFlux应用程序。**

java 复制代码
public class WebClientExample {  
  
    public static void main(String[] args) {  
        WebClient webClient = WebClient.create("http://1234.com");  
  
        webClient.get()  
                .uri("/api/data")  
                .retrieve()  
                .bodyToMono(String.class)  
                .subscribe(  
                        body -> System.out.println(body),  
                        error -> System.err.println("Error occurred: " + error)  
                );  
    }  
}

6. OpenFeign

**  注意这里是OpenFeign可不是Spring Cloud OpenFeign,Spring Cloud openfeign对OpenFeign进行了包装,所以在使用上是有差别的。**

添加依赖

java 复制代码
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-core</artifactId>
  <version>13.2.1</version>
</dependency>
java 复制代码
public interface MyFeignClient {  
  
    @RequestLine("GET /api/data")  
    String getData();  
  
    static MyFeignClient create() {  
        return Feign.builder()  
                .encoder(new JacksonEncoder())  
                .decoder(new JacksonDecoder())  
                .logger(new Logger.ErrorLogger())  
                .logLevel(Level.FULL)  
                .retryer(new Retryer.Default(100, TimeUnit.MILLISECONDS.toMillis(1), 5))  
                .target(Target.EmptyTarget.create(MyFeignClient.class, "http://123456.com"));  
    }  
}
java 复制代码
MyFeignClient client = MyFeignClient.create();  
String data = client.getData();  
System.out.println(data); 

**  以上对 Spring Boot 调用外部接口的六种方式进行了简单介绍,但实践中需要依据项目具体需求和实际情况进行选择,以确保项目导向和效率最优。**

相关推荐
葫芦和十三5 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp6 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑6 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯7 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan9 小时前
多Agent之间的区别
后端
青石路11 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充11 小时前
1.面向对象设计思想
后端
IT_陈寒12 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro12 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗12 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端