当前位置: 首页 > 知识库问答 >
问题:

如何让Java Rest API在前半部分处理后返回响应,然后在返回响应后继续后半部分?

茹正初
2023-03-14

我有一个使用Spring Boot的APIendpoint。这个endpoint所做的是调用另外两个APIendpoint并处理它们的响应。

该过程的前半部分调用一个 API 终结点,获取响应并将此响应与 202 Accepted 一起返回到表面。

在202被返回之后,后台正在经历该过程的第二部分。它从第一个API调用中获取响应并进一步处理它。

我尝试过使用ExecutorComppletableFuture,但它们在返回202之后都停止了,并且不会运行下半部分,或者他们等到下半部分才能完成,只返回202。

这有可能实现吗?还是我在寻找错误的设计?

以下是一些示例代码

@PostMapping("/user")
public ResponseEntity<?> processUser(@Valid @RequestBody UserRequestDto request,
                                            @RequestHeader("Authorization") String token) throws Exception {
    CompletableFuture<UserResponseDto> response = CompletableFuture.supplyAsync(() ->
            userService.processUser(request, token));
        
    userService.processUserSecond(response, token);

    return new ResponseEntity<>(response, HttpStatus.ACCEPTED);
}

共有1个答案

雍河
2023-03-14

要明确一点:RESTendpoint由两个调用组成-<code>processUser。您希望获得<code>processUser

请记住,在这种情况下,第一次调用必须是同步的,因为您等待其结果在后续调用中使用。后者可以是异步的。

@PostMapping("/user")
public ResponseEntity<?> processUser(@Valid @RequestBody UserRequestDto request,
                                            @RequestHeader("Authorization") String token) 
{
   // synchronous, waiting for the response to be used
   UserResponseDto response = userService.processUser(request, token);

   // asynchronous, fired without waiting for the response
   CompletableFuture.runAsync(() -> userService.processUserSecond(response, token));
       
   // return the result of the first (an only) synchronous call 
   return new ResponseEntity<>(response, HttpStatus.ACCEPTED);
}
 类似资料:
  • 问题内容: Flask返回响应后,我需要执行一些代码。我认为为它设置像Celery这样的任务队列不够复杂。关键要求是Flask必须在运行此功能之前将响应返回给客户端。它不能等待函数执行。 对此存在一些现有问题,但是在将响应发送到客户端之后,似乎没有一个答案能解决运行任务的问题,它们仍然同步执行,然后返回响应。 问题答案: 长话短说,Flask没有提供任何特殊功能来完成此任务。对于简单的一次性任务,

  • 问题内容: 我正在构建RESTful API,并希望为开发人员提供选择以在JSON响应中返回哪些字段的选项。 这篇博客文章显示了几个API(Google,Facebook,LinkedIn)如何允许开发人员自定义响应的示例。这称为部分响应。 一个示例可能看起来像这样: 在上面的示例中,API应该返回用户“ 123”的userId,fullName和title字段。 我正在寻找有关如何在我的REST

  • 我知道类似的帖子,我也检查过,但没有一个能帮到我。 我想POST到一个需要三个参数和一个基本身份验证的API(管理示例任务)。在postman中它可以工作。我提供的正文如下: 并设置基本身份验证(使用用户名和密码)。API发送如下响应: 如果我向api发送POST,一切都很好,但现在我想在java中实现它。如果我尝试发送一个POST: HttpClientErrorException: 400错误

  • 在一些请求中,我们会做一些日志的推送、用户数据的统计等和返回给终端数据无关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。 这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。 怎么做到呢?我们先看其中的一种方法: local response

  • 问题内容: 由于JavaScript在单个线程中运行,因此在发出AJAX请求后,后台实际发生了什么?我想对此有更深入的了解,有人可以阐明吗? 问题答案: 在幕后,javascript具有事件队列。每次执行javascript线程完成时,它都会检查队列中是否还有其他事件要处理。如果存在,它将退出队列并触发该事件(例如,单击鼠标)。 位于ajax调用下的本机代码网络将知道ajax响应何时完成,并且事件