用java springboot写一个幂等接口
时间: 2024-01-04 19:04:48 浏览: 77
Springboot+redis+Interceptor+自定义annotation实现接口自动幂等
好的,幂等接口指的是在接口重复调用时,返回的结果应该是相同的。为了实现幂等接口,我们需要在系统中引入一个唯一标识(如UUID),并在接口调用时将该标识作为参数传入。
以下是一个使用Spring Boot编写的幂等接口示例:
1.在pom.xml文件中添加依赖
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
2.在application.yml文件中配置Redis连接信息
```
spring:
redis:
host: localhost
port: 6379
```
3.创建一个幂等请求拦截器IdempotencyInterceptor.java
```
@Component
public class IdempotencyInterceptor extends HandlerInterceptorAdapter {
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestId = request.getHeader("requestId");
String key = "idempotency:" + requestId;
if (redisTemplate.hasKey(key)) {
// 如果该请求已经被处理过,则直接返回之前的响应结果
String result = redisTemplate.opsForValue().get(key);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(result);
return false;
} else {
// 否则,将请求标识存入Redis,并继续执行接口方法
redisTemplate.opsForValue().set(key, "processing...", 60, TimeUnit.SECONDS);
return true;
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestId = request.getHeader("requestId");
String key = "idempotency:" + requestId;
// 请求处理完成后,删除Redis中的请求标识
redisTemplate.delete(key);
}
}
```
4.在Controller中使用拦截器
```
@RestController
public class IdempotentController {
@Autowired
private IdempotencyInterceptor idempotencyInterceptor;
@RequestMapping("/test")
@Interceptors(IdempotencyInterceptor.class) // 使用自定义拦截器
public String test(HttpServletRequest request) {
// 接口实现逻辑
return "SUCCESS";
}
}
```
这样,当接口重复调用时,系统会通过Redis中的请求标识判断该请求是否已经被处理过,如果是,则直接返回之前的响应结果;如果否,则继续执行接口方法,并将该请求标识存入Redis,以便后续重复调用时进行判断。
阅读全文