目录
[1. 添加请求头(如认证)](#1. 添加请求头(如认证))
[2. 超时配置(application.yml)](#2. 超时配置(application.yml))
[3. 日志配置](#3. 日志配置)
以下是Spring Boot项目通过Feign调用第三方接口的详细教程,包含完整步骤和代码示例:
一、环境准备
-
创建Spring Boot项目
使用Spring Initializr生成项目,选择依赖:
Spring Web
OpenFeign
-
pom.xml依赖
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客户端
在启动类添加注解:
java
@SpringBootApplication
@EnableFeignClients // 关键注解
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
三、定义Feign客户端接口
创建接口声明第三方API调用:
java
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
java
// 请求示例
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中注入并使用:
java
@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. 添加请求头(如认证)
java
@FeignClient(name = "authApi", url = "https://api.example.com")
public interface AuthClient {
@GetMapping("/profile")
ProfileResponse getProfile(
@RequestHeader("Authorization") String token // 动态传递Header
);
}
2. 超时配置(application.yml)
yaml
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时(ms)
readTimeout: 10000 # 读取超时(ms)
3. 日志配置
java
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // 输出完整请求日志
}
}
在application.yml
启用日志:
yaml
logging:
level:
com.example.demo.client.ThirdPartyClient: DEBUG
七、错误处理
自定义错误解码器
java
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");
}
}
在配置类注册:
java
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
八、测试调用
java
@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
)
-
超时问题
调整配置:
yamlribbon: ConnectTimeout: 3000 ReadTimeout: 60000
-
JSON解析错误
确保DTO字段名与JSON属性名匹配,或使用
@JsonProperty
注解 -
启用GZIP压缩(提升性能)
yamlfeign: compression: request: enabled: true response: enabled: true
提示:实际调用前建议使用Postman测试第三方接口可用性。