欢迎!
我一直在努力

请求中台服务接口数据,然后将相应的字段数据存到本地数据库,持久层用mybatis_plus, 并且将请求头token等信息和请求体分离处理

定义请求体对应的 Java 对象,假设请求体中有一个 name 字段,我们可以定义一个如下的对象:
java
Copy code
public class RequestBody {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
定义响应体对应的 Java 对象,假设响应体中有一个 id 字段,我们可以定义一个如下的对象:
java
Copy code
public class ResponseBody {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
定义请求头中的 token 字段,我们可以定义一个如下的对象:
java
Copy code
public class Token {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
定义请求的 DTO 对象,该对象包含请求头中的 token 和请求体中的数据,我们可以定义一个如下的对象:
java
Copy code
public class RequestDTO {
    private Token token;
    private RequestBody body;

    public Token getToken() {
        return token;
    }

    public void setToken(Token token) {
        this.token = token;
    }

    public RequestBody getBody() {
        return body;
    }

    public void setBody(RequestBody body) {
        this.body = body;
    }
}
在控制器中定义一个处理请求的方法,代码如下:
java
Copy code
@RestController
public class MyController {
    @Autowired
    private MyService myService;

    @PostMapping("/api/call-service")
    public ResponseBody callService(@RequestBody RequestBody body, @RequestHeader("token") String token) {
        // 将请求头和请求体封装到 DTO 对象中
        RequestDTO requestDTO = new RequestDTO();
        Token tokenObj = new Token();
        tokenObj.setValue(token);
        requestDTO.setToken(tokenObj);
        requestDTO.setBody(body);

        // 调用服务
        ResponseBody responseBody = myService.callService(requestDTO);

        // 返回响应
        return responseBody;
    }
}
在上述代码中,我们使用了 @RequestBody 注解和 @RequestHeader 注解来分别处理请求体和请求头,并将它们封装到 RequestDTO 对象中。

在服务层中实现服务的逻辑,并将相应的字段数据存到本地数据库中,使用 Mybatis-Plus 框架操作数据库,代码如下:
java
Copy code
@Service
public class MyServiceImpl implements MyService {
    @Autowired
    private MyMapper myMapper;

    @Override
    public ResponseBody callService(RequestDTO requestDTO) {
        // 获取请求头中的 token
        String token = requestDTO.getToken().getValue();

        // 获取请求体中的数据
        RequestBody body = requestDTO.getBody();

        // 这里省略调用中台服务接口的代码,假设返回的响应数据包含一个 id 字段
        int id = 123;

        // 将数据存储到本地数据库中
        MyEntity entity = new MyEntity();
        entity.setName(body.getName());
        entity




接下来可以考虑将请求头和请求体分离处理。具体实现方式可以参考以下步骤:

1.创建一个请求体的POJO类,用于存储请求体中的参数。例如:

java
Copy code
public class RequestBody {
    private String param1;
    private int param2;
    
    // getter/setter
}
2.创建一个拦截器,在拦截器中将请求头中的token等信息解析出来,并将解析后的信息放入ThreadLocal中。例如:

java
Copy code
@Component
public class RequestInterceptor implements HandlerInterceptor {
    private static final ThreadLocal<String> TOKEN_THREAD_LOCAL = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        TOKEN_THREAD_LOCAL.set(token);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求结束时清除ThreadLocal
        TOKEN_THREAD_LOCAL.remove();
    }

    public static String getToken() {
        return TOKEN_THREAD_LOCAL.get();
    }
}
3.在Controller层中,使用@RequestBody注解将请求体映射到RequestBody对象中,使用@Autowired注解将RequestInterceptor注入到Controller中。在调用中台接口时,从RequestInterceptor中获取token等信息。例如:

java
Copy code
@RestController
@RequestMapping("/api")
public class ApiController {
    @Autowired
    private RequestInterceptor requestInterceptor;
    @Autowired
    private ApiService apiService;

    @PostMapping("/data")
    public ResultData getData(@RequestBody RequestBody requestBody) {
        String token = requestInterceptor.getToken();
        // 调用中台接口
        ResultData resultData = apiService.getData(requestBody.getParam1(), requestBody.getParam2(), token);
        // 将返回数据存入本地数据库
        // ...
        return resultData;
    }
}
4.在持久层中使用mybatis-plus进行数据入库操作。例如:

java
Copy code
@Repository
public interface DataMapper extends BaseMapper<DataEntity> {
}
java
Copy code
@Service
public class DataServiceImpl implements DataService {
    @Autowired
    private DataMapper dataMapper;

    @Override
    public void saveData(String param1, int param2) {
        DataEntity dataEntity = new DataEntity();
        dataEntity.setParam1(param1);
        dataEntity.setParam2(param2);
        dataMapper.insert(dataEntity);
    }
}




当我们将请求头和请求体分离处理后,可以在controller层中分别获取这两个部分的数据,例如:

java
Copy code
@PostMapping("/api/user")
public String addUser(@RequestHeader("token") String token, @RequestBody UserDTO userDTO) {
    // 处理请求头信息
    // ...

    // 处理请求体信息
    // ...

    // 调用中台服务接口
    UserVO userVO = userService.addUser(userDTO, token);

    // 将返回的数据保存到本地数据库
    userMapper.insert(userVO);

    return "success";
}
其中,@RequestHeader("token")用于获取请求头中名为"token"的字段值,@RequestBody用于获取请求体中的数据。在调用中台服务接口时,我们需要将请求头中的token传递给服务端。

接着,我们在UserService中实现添加用户的方法,调用中台服务接口并返回结果:

java
Copy code
@Service
public class UserService {
    @Autowired
    private RestTemplate restTemplate;

    @Value("${backend.service.addUserUrl}")
    private String addUserUrl;

    public UserVO addUser(UserDTO userDTO, String token) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("token", token);

        HttpEntity<UserDTO> request = new HttpEntity<>(userDTO, headers);
        ResponseEntity<UserVO> response = restTemplate.exchange(addUserUrl, HttpMethod.POST, request, UserVO.class);

        return response.getBody();
    }
}
在这里,我们使用了RestTemplate来发起HTTP请求,其中HttpHeaders用于设置请求头,HttpEntity用于将请求体和请求头组装成一个请求对象,ResponseEntity用于接收中台服务接口返回的数据。addUserUrl是从配置文件中读取的中台服务接口地址。

最后,我们将返回的数据保存到本地数据库中,这里我们使用了Mybatis-Plus提供的insert方法:

java
Copy code
@Service
public class UserService {
    // ...

    @Autowired
    private UserMapper userMapper;

    public UserVO addUser(UserDTO userDTO, String token) {
        // ...

        ResponseEntity<UserVO> response = restTemplate.exchange(addUserUrl, HttpMethod.POST, request, UserVO.class);
        UserVO userVO = response.getBody();

        userMapper.insert(userVO);

        return userVO;
    }
}
这样,就完成了请求中台服务接口数据,并将相应的字段数据存到本地数据库的操作,同时也实现了将请求头和请求体分离处理的需求。
赞(0) 打赏
未经允许不得转载:2023 » 请求中台服务接口数据,然后将相应的字段数据存到本地数据库,持久层用mybatis_plus, 并且将请求头token等信息和请求体分离处理
分享到: 更多 (0)

评论+留言 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得还可以就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏