目录
以下是Spring Boot项目通过Feign调用第三方接口的详细教程,包含完整步骤和代码示例:
一、环境准备
创建Spring Boot项目
使用Spring Initializr生成项目,选择依赖:Spring Web
OpenFeign
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 {
@Autowired
private 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 {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // 输出完整请求日志
}
}
在application.yml
启用日志:
logging:
level:
com.example.demo.client.ThirdPartyClient: DEBUG
七、错误处理
自定义错误解码器
public class CustomErrorDecoder implements ErrorDecoder {
@Override
public 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 {
@Autowired
private ApiService apiService;
@GetMapping("/user/{id}")
public UserResponse getUser(@PathVariable Long id) {
return apiService.fetchUser(id);
}
}
常见问题解决
404错误
- 检查第三方URL是否正确
- 确认接口路径是否包含上下文路径(如
/api/v1
)
超时问题
调整配置:ribbon: ConnectTimeout: 3000 ReadTimeout: 60000
JSON解析错误
确保DTO字段名与JSON属性名匹配,或使用@JsonProperty
注解启用GZIP压缩(提升性能)
feign: compression: request: enabled: true response: enabled: true
提示:实际调用前建议使用Postman测试第三方接口可用性。