java - RestTemplate:exchange() vs postForEntity() vs execute()

标签 java spring-boot resttemplate

我正在使用 Spring boot 开发 Rest API,我必须访问应用程序的端点。我为此使用了 RestTemplate。我能够使用 2 种方法做到这一点,

  • postForEntity():

    responseEntity = 
        restTemplate.postForEntity(uri, httpEntity, ResponseClass.class);
    
  • exchange():

    responseEntity = 
        restTemplate.exchange(uri, HttpMethod.POST, httpEntity, ResponseClass.class);
    

我想知道这两种方法的用法和区别。

我还看到了另一种方法 execute()。请说明一下。如何以及何时使用它。

最佳答案

RestTemplate 是一个非常通用的对象。

让我们从execute开始,因为它是最通用的方法:

execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
        @Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)

请注意 uriVariables 也可以作为 Map 传递。

execute 旨在适用于尽可能多的场景:

  • 第一个和第二个参数允许 URL 和方法的任何有效组合。
  • 可以通过传递自定义 RequestCallback(一个只有一个方法的 @FunctionalInterface doWithRequest(ClientHttpRequest request)) 在发送之前。
  • 可以通过传递自定义 ResponseExtractor 以任何必要的方式反序列化从远程资源返回的响应。

将此与 exchange 进行比较:

exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
         Class<T> responseType, Object... uriVariables)

这里有两个主要区别:

  • 您现在可以直接传递 HttpEntity,而之前需要使用 RequestCallback 手动设置。
  • 反序列化机制是通过传递所需的响应类型 Class 开箱即用的。

如您所见,这对于日常使用来说更加方便。

getForEntitypostForEntity 这样的方法甚至更短、更容易理解:

getForEntity(String url, Class<T> responseType, Object... uriVariables)

postForEntity(String url, @Nullable Object request, Class<T> responseType,
              Object... uriVariables)

注意 postForEntity 现在允许您直接 POST 任何 Object 而无需包装器。使用这些代替 execute 没有性能优势或损害,因为它们在后台调用 execute - 这只是一个方便的问题。

关于java - RestTemplate:exchange() vs postForEntity() vs execute(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52364187/

相关文章:

spring - 如何在 .html 文件中使用 Keycloak,将 thymleaf 与 spring security 一起使用?

java - 如何跨包集中多个存储库的一个配置?

java - 带有 Spring RESTTemplate 的泛型

java - Resttemplate 等效/curl -T 或 --upload-file 选项的映射

java - 如何断言 Rest Client 异常?

javax.net.ssl.SSLKeyException : [Security:090477]Certificate chain received from intranet. xxx.com

由于递归构造函数调用导致java堆栈溢出

java - 使用 Retrofit Android 获取带参数的请求

JavaFX:如何在代码中设置背景图像?

java - 带有 Spring 引导的 JUnit 5 - 如何使用不同的配置文件重复测试?