我们如何在 Java 中进行异步 REST api 调用?

新手上路,请多包涵

我正在使用 Spring RestTemplate 并想调用另一个不返回任何响应主体的服务。所以,我不想等待回应。所以,它只是火了,不管了,继续剩下的代码。我正在考虑创建一个新线程来执行此操作,但真的不确定什么是正确的方法。

原文由 user10937286 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 728
2 个回答

正确的方法是使用回调执行异步(使用 DeferredResult ,像这样(假设我们有一个类 someClass 我们想从 API 检索:

 @GetMapping(path = "/testingAsync")
public DeferredResult<String> value() throws ExecutionException, InterruptedException, TimeoutException {
   AsyncRestTemplate restTemplate = new AsyncRestTemplate();
   String baseUrl = "http://someUrl/blabla";
   HttpHeaders requestHeaders = new HttpHeaders();
   requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
   String value = "";

   HttpEntity entity = new HttpEntity("parameters", requestHeaders);
   final DeferredResult<String> result = new DeferredResult<>();
   ListenableFuture<ResponseEntity<someClass>> futureEntity = restTemplate.getForEntity(baseUrl, someClass.class);

   futureEntity.addCallback(new ListenableFutureCallback<ResponseEntity<someClass>>() {
      @Override
      public void onSuccess(ResponseEntity<someClass> result) {
         System.out.println(result.getBody().getName());
         result.setResult(result.getBody().getName());
      }

      @Override
      public void onFailure(Throwable ex) {
         result.setErrorResult(ex.getMessage());
      }
  });

  return result;
}

原文由 Gal Naor 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你使用 Java 11,java 支持异步 HTTP 客户端。异步客户端在后面使用 CompletableFuture 。你可以看到 javadoc

 HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://openjdk.java.net/"))
            .timeout(Duration.ofMinutes(1))
            .header("Content-Type", "application/json")
            .POST(BodyPublishers.ofFile(Paths.get("file.json")))
            .build();

    client.sendAsync(request, BodyHandlers.ofString())
            .thenApply(response -> { System.out.println(response.statusCode());
                return response; } )
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println);

原文由 Turac 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题