当前位置: 首页 > news >正文

Spring Boot项目通过Feign调用三方接口的详细教程

目录

一、环境准备

二、启用Feign客户端

三、定义Feign客户端接口

四、定义请求/响应DTO

五、调用Feign客户端

六、高级配置

1. 添加请求头(如认证)

2. 超时配置(application.yml)

3. 日志配置

七、错误处理

自定义错误解码器

八、测试调用

常见问题解决


以下是Spring Boot项目通过Feign调用第三方接口的详细教程,包含完整步骤和代码示例:


一、环境准备

  1. 创建Spring Boot项目
    使用Spring Initializr生成项目,选择依赖:

    • Spring Web
    • OpenFeign
  2. pom.xml依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.3</version> <!-- 与Spring Boot版本匹配 --></dependency>
    </dependencies>
    


二、启用Feign客户端

在启动类添加注解:

@SpringBootApplication
@EnableFeignClients // 关键注解
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}


三、定义Feign客户端接口

创建接口声明第三方API调用:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@FeignClient(name = "thirdPartyApi", url = "https://api.example.com" // 第三方接口基地址
)
public interface ThirdPartyClient {// 示例:GET请求@GetMapping("/users/{id}")UserResponse getUser(@PathVariable("id") Long userId);// 示例:POST请求@PostMapping("/orders")OrderResponse createOrder(@RequestBody OrderRequest request);
}


四、定义请求/响应DTO

// 请求示例
public class OrderRequest {private String productId;private Integer quantity;// getters/setters
}// 响应示例
public class UserResponse {private Long id;private String name;private String email;// getters/setters
}


五、调用Feign客户端

在Service中注入并使用:

@Service
public class ApiService {@Autowiredprivate ThirdPartyClient thirdPartyClient; // 注入Feign客户端public UserResponse fetchUser(Long userId) {return thirdPartyClient.getUser(userId); // 调用第三方API}public void createNewOrder(OrderRequest request) {OrderResponse response = thirdPartyClient.createOrder(request);System.out.println("Order created: " + response.getOrderId());}
}


六、高级配置

1. 添加请求头(如认证)
@FeignClient(name = "authApi", url = "https://api.example.com")
public interface AuthClient {@GetMapping("/profile")ProfileResponse getProfile(@RequestHeader("Authorization") String token // 动态传递Header);
}

2. 超时配置(application.yml)
feign:client:config:default:connectTimeout: 5000  # 连接超时(ms)readTimeout: 10000     # 读取超时(ms)

3. 日志配置
@Configuration
public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // 输出完整请求日志}
}

application.yml启用日志:

logging:level:com.example.demo.client.ThirdPartyClient: DEBUG


七、错误处理

自定义错误解码器
public class CustomErrorDecoder implements ErrorDecoder {@Overridepublic Exception decode(String methodKey, Response response) {if (response.status() == 404) {return new ResourceNotFoundException("API resource not found");}return new FeignException.BadRequest("API request failed");}
}

在配置类注册:

@Bean
public ErrorDecoder errorDecoder() {return new CustomErrorDecoder();
}


八、测试调用

@RestController
public class DemoController {@Autowiredprivate ApiService apiService;@GetMapping("/user/{id}")public UserResponse getUser(@PathVariable Long id) {return apiService.fetchUser(id);}
}


常见问题解决

  1. 404错误

    • 检查第三方URL是否正确
    • 确认接口路径是否包含上下文路径(如/api/v1
  2. 超时问题
    调整配置:

    ribbon:ConnectTimeout: 3000ReadTimeout: 60000
    

  3. JSON解析错误
    确保DTO字段名与JSON属性名匹配,或使用@JsonProperty注解

  4. 启用GZIP压缩(提升性能)

    feign:compression:request:enabled: trueresponse:enabled: true
    

提示:实际调用前建议使用Postman测试第三方接口可用性。

http://www.lryc.cn/news/619900.html

相关文章:

  • 力扣top100(day02-04)--二叉树 01
  • 阿里云Anolis OS 8.6的公有云仓库源配置步骤
  • 旧版MinIO的安装(windows)、Spring Boot 后端集成 MinIO 实现文件存储(超详细,带图文)
  • oss(阿里云)前端直传
  • 4G模块 ML307A通过MQTT协议连接到阿里云
  • ImportError: Encountered error: Failed to import NATTEN‘s CPP backend.
  • 事件处理与组件基础
  • 飞算JavaAI实现数据库交互:JPA/Hibernate + MyBatis Plus基础功能学习
  • 基于微信小程序的工作日报管理系统/基于asp.net的工作日报管理系统
  • CAD 的 C# 开发中,对多段线(封闭多边形)内部的点进行 “一笔连线且不交叉、不出界
  • 重生之我在公司写前端 | “博灵语音通知终端” | 登录页面
  • [量化交易](1获取加密货币的交易数据)
  • 01数据结构-Prim算法
  • Unity、C#常用的时间处理类
  • Gradle(三)创建一个 SpringBoot 项目
  • C++ 中构造函数参数对父对象的影响:父子控件管理机制解析
  • 【完整源码+数据集+部署教程】火柴实例分割系统源码和数据集:改进yolo11-rmt
  • 学习语言的一个阶段性总结
  • Linux操作系统应用编程——文件IO
  • Nginx的SSL通配符证书自动续期
  • 精准阻断内网渗透:联软科技终端接入方案如何“锁死”横向移动?
  • MySQL中的查询、索引与事务
  • MySQL三大存储引擎对比:InnoDB vs MyISAM vs MEMORY
  • RuoYi-Cloud 接入 Sentinel 的 3 种限流方式
  • Android 双屏异显技术全解析:从原理到实战的多屏交互方案
  • Ubuntu 20.04 虚拟机安装完整教程:从 VMware 到 VMware Tools
  • 基于.Net Framework4.5 Web API 引用Swagger
  • nginx高性能web服务器实验
  • INTERSPEECH 2025 | 数据堂诚邀您参加MLC-SLM挑战赛暨研讨会
  • JVM安全点轮询汇编函数解析