Java 休息 API POST return 未来
Java REST API POST return Future
在我的一个项目中,我想在 Spring Boot (1.5.8) 中使用 POST 开发异步 REST API,因为 API 执行的代码很长。
第一个问题是:从 POST 请求中 return 一个 CallableFuture
有意义吗?
如果是这样,如何在有效响应到来之前阻止客户端?
这是我的 REST API 的代码:
@RequestMapping(method = RequestMethod.POST)
public CompletableFuture<String> postAPI(@RequestBody() String param) {
LOGGER.info("I received a POST request");
CompletableFuture<String> result = CompletableFuture.completedFuture(function(param));
return result;}
下面是我用来调用它并检索结果的代码。
ListenableFuture<ResponseEntity<String>> response = restTemplate
.exchange(uri, HttpMethod.POST, entity,
String.class);
ResponseEntity<String> result = response.get();
String response = result.getBody();
response.get()
实际上并没有阻止执行,所以 getBody()
总是 return 为空。
我假设您错过了一个要点,即客户端和服务器之间通过 HTTP 进行的通信始终采用 "Request-Response" 模型。
意思是:
在服务器端 - 当您 return result;
- 请求完成时。
在客户端 - 当您收到响应时,此请求-响应通信就完成了。
所以你有两个选择:
从客户端发出另一个请求以获得您在第一个响应中发送的 CompletableFuture
结果的实际结果。当然在服务器端有相应的方法。然后客户端将等待服务器 returns 实际结果。
在服务器有实际结果之前不要完成第一次调用。这似乎不是您想要做的,但是...
如果您想阻止客户端 - 发送即时 CompletableFuture
响应的真正原因是什么?
从客户端执行此类操作的唯一原因是 在服务器处理请求时不要阻止客户端。
在我的一个项目中,我想在 Spring Boot (1.5.8) 中使用 POST 开发异步 REST API,因为 API 执行的代码很长。
第一个问题是:从 POST 请求中 return 一个 CallableFuture
有意义吗?
如果是这样,如何在有效响应到来之前阻止客户端?
这是我的 REST API 的代码:
@RequestMapping(method = RequestMethod.POST)
public CompletableFuture<String> postAPI(@RequestBody() String param) {
LOGGER.info("I received a POST request");
CompletableFuture<String> result = CompletableFuture.completedFuture(function(param));
return result;}
下面是我用来调用它并检索结果的代码。
ListenableFuture<ResponseEntity<String>> response = restTemplate
.exchange(uri, HttpMethod.POST, entity,
String.class);
ResponseEntity<String> result = response.get();
String response = result.getBody();
response.get()
实际上并没有阻止执行,所以 getBody()
总是 return 为空。
我假设您错过了一个要点,即客户端和服务器之间通过 HTTP 进行的通信始终采用 "Request-Response" 模型。
意思是:
在服务器端 - 当您 return result;
- 请求完成时。
在客户端 - 当您收到响应时,此请求-响应通信就完成了。
所以你有两个选择:
从客户端发出另一个请求以获得您在第一个响应中发送的
CompletableFuture
结果的实际结果。当然在服务器端有相应的方法。然后客户端将等待服务器 returns 实际结果。在服务器有实际结果之前不要完成第一次调用。这似乎不是您想要做的,但是... 如果您想阻止客户端 - 发送即时
CompletableFuture
响应的真正原因是什么?
从客户端执行此类操作的唯一原因是 在服务器处理请求时不要阻止客户端。