java - Spring Boot外部api调用请求和数据库中的响应捕获

标签 java spring-boot design-patterns microservices software-design

从我的后端应用程序(springboot、java8)我将进行多个外部 api 调用。我需要将所有请求和响应数据(包括 header 、请求和响应正文)记录到数据库(MongoDB)中。

下面是我的示例代码,这是我 try catch 每个外部 api 调用的请求和响应的方式。在异常(exception)情况下,我会将状态存储为“失败”。

在我的项目中,将在新的第 3 方 api 集成中添加多个模块,因此在每个模块中,对于每个不同的外部 api 调用,我必须捕获像这样的所有请求和响应。我对以下方法不满意。请建议解决此问题的最佳方法。

服务层方法示例

public ResponseDTOFromExternalApi externalApiCallServiceMethod(String clientId, RequestDTO requestDTO) {

        ExternalApiCallRequestObj externalApiCallRequestObj = prepareExternalApiRequestObjFromRequestDTO(requestDTO);
        ApiCall apiCall = ApiCall.builder()
                .clientId(clientId)
                .status("SUBMITTED")
                .requestPayload(externalApiCallRequestObj)
                .build();

        apiCall = apiCallRepository.save(apiCall);

        ExternalApiCallReponseObj externalApiCallReponseObj = externalApiCallService.callExternalApi1(externalApiCallRequestObj);

        apiCall = apiCallRepository.findById(apiCall.getId());

        apiCall.setResponsePayload(externalApiCallReponseObj);
        apiCall.setStatus("COMPLETED");

        apiCallRepository.save(apiCall);

        return toDTO(externalApiCallReponseObj);
}

API 调用的示例域

@Document("api_calls")
@Builder
@Data
public class ApiCall {

    @Id
    private String id;

    private String clientId;

    private String status;

    private Object requestPayload;

    private Object responsePayload;

}

最佳答案

Spring 的 WebClient 已经能够通过添加交换过滤器来记录所有请求和响应数据。

通过将其用于网络请求,剩下要做的唯一一件事就是将此信息写入 mongodb。

这是有关记录请求和响应的教程: https://www.baeldung.com/spring-log-webclient-calls

干杯

关于java - Spring Boot外部api调用请求和数据库中的响应捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60014084/

相关文章:

java - Spark + Kafka 流 NoClassDefFoundError kafka/serializer/StringDecoder

java - 返回给定字符串中第一次和最后一次出现 "bread"之间的字符串

java - 将小部件导出到 jar 中

java - MongoDB 文档的 @Id 是 HashMap 的属性?

design-patterns - 异步图片上传模式

c# - c#:How its possible to pass one object as a parameter only for one time in c#中双向关联的实现

java - 时间戳在 android 中不是当前的

java - server.tomcat.max-threads VS corePoolSize VS spring.datasource.tomcat.max

spring - 在 Spring Boot 的 Servlet 配置中添加过滤器

java - 遍历要执行的命令列表——哪种模式?