Java REST API POST возвращает будущее - PullRequest
0 голосов
/ 18 октября 2018

В одном из моих проектов я хочу разработать Asynchronous REST API в Spring Boot (1.5.8) с POST, потому что код, выполняемый API, очень длинный.

Первый вопрос: имеет ли смысл возвращать CallableFuture из запроса POST?Если так, как заблокировать клиента, пока не придет эффективный ответ?

Вот код моего 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() всегда возвращает ноль.

1 Ответ

0 голосов
/ 18 октября 2018

Я предполагаю, что вы упустили главное замечание, что связь между клиентом и сервером по HTTP всегда осуществляется в модели «запрос-ответ».

Это означает:

на стороне сервера - когда вы return result; - запрос выполнен.

на стороне клиента - когда вы получили ответ, эта связь запрос-ответ завершена,

Таким образом, у вас есть два варианта:

  • сделать еще один запрос от клиента, чтобы получить фактический результат для CompletableFuture результата, который вы отправили в первом ответе.Конечно с соответствующим методом на стороне сервера.Затем клиент будет ждать, пока сервер не вернет фактический результат.

  • Не завершайте первый вызов, пока сервер не получит фактический результат.Похоже, это не то, что вы хотите сделать, но ... Если вы хотите заблокировать клиента - какова действительная причина для отправки немедленного CompletableFuture ответа вообще?

Существует только одна причина, чтобы делать такие вещи со стороны клиента, это не блокировать клиента , пока сервер обрабатывает запрос.

...