Spring Boot + Feign 实现第三方接口调用
开发的系统服务中,我们常常需要同许多第三方接口进行对接集成。使用Feign可以更简单地实现HTTP调用,尤其是集成第三方API时。
1. 添加依赖
首先,在pom.xml中添加Feign的依赖:
io.github.openfeign
feign-core
11.0
io.github.openfeign
feign-jackson
11.0
io.github.openfeign
feign-spring4
11.0
然后,在application.yml中配置Feign相关信息:
feign:
client:
config:
default:
loggerLevel: full //生产环境中,建议调整为basic或none,以避免日志过多
connectTimeout: 5000
readTimeout: 5000
2. 开启Feign功能
在Spring Boot的启动类中,使用@EnableFeignClients注解来启用Feign功能:
@SpringBootApplication
@EnableFeignClients // 开启 Feign 功能
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
3. 创建Feign客户端接口
接下来,创建一个Feign客户端接口来定义与第三方接口的交互方式。例如,我们需要调用一个视频详情查询的API:
public interface VideoFeignClient {
@GetMapping(consumes = "application/json")
VideoResult getVideoDetail(@RequestParam("videoId") Long videoId);
}
在这个接口中,@GetMapping表示HTTP GET请求,@RequestParam用于传递请求参数。
4. feign客户端工厂类
为了灵活地创建Feign客户端实例,可以使用工厂模式。通过Feign.Builder动态生成Feign客户端实例:
@Component
public class FeignClientFactory {
@Resource
private Feign.Builder feignBuilder;
public VideoFeignClient createVideoFeignClient(String url) {
return feignBuilder.target(VideoFeignClient.class, url);
}
}
5. 创建响应对象
定义一个响应对象类VideoResult来接收API的返回结果:
@Schema(description = "分页结果")
@Data
public class VideoResult implements Serializable {
@Schema(description = "错误码", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer code;
@Schema(description = "错误提示", requiredMode = Schema.RequiredMode.REQUIRED)
private String msg;
@Schema(description = "视频列表", requiredMode = Schema.RequiredMode.REQUIRED)
private T data;
public VideoResult() {
}
public VideoResult(T data) {
this.data = data;
}
}
定义视频详情实体类,接受第三方接口返回的视频详情信息:
@Data
public class VideoDetailRespVO {
@Schema(description = "视频id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long vodId;
@Schema(description = "分类id", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer typeId;
@Schema(description = "视频名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String vodName;
@Schema(description = "副标题", requiredMode = Schema.RequiredMode.REQUIRED)
private String vodSub;
@Schema(description = "英文名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String vodEn;
// ....更多属性
}
6. 使用Feign客户端
在服务层,注入Feign客户端并调用第三方接口:
@Service
public class VideoService {
@Resource
private FeignClientFactory feignClientFactory;
public VideoResult getVideoDetail(Long videoId) {
// 可以从数据库配置中获取第三方接口的访问地址
String url = 获取第三方的访问地址;
VideoFeignClient videoFeignClient = feignClientFactory.createVideoFeignClient(url);
return videoFeignClient.getVideoDetail(videoId);
}
}
在Controller中调用该服务方法:
@RestController
@RequestMapping("/video")
public class VideoController {
@Autowired
private VideoService videoService;
@GetMapping
public VideoResult getVideoDetail(@RequestParam Long videoId) {
return videoService.getVideoDetail(videoId);
}
}
6. 流程图
以下是调用流程的简要图示:
7. 总结
使用Spring Boot结合Feign,可以非常方便地实现与第三方接口的集成。通过声明一个 Feign 客户端接口,并通过 @FeignClient 注解与第三方服务进行集成,我们可以快速实现 HTTP 请求的调用,而无需手动编写复杂的 RestTemplate 或 HttpURLConnection 代码。