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

2022-09-01 03:11:05

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

  • postForEntity()

    responseEntity = 
        restTemplate.postForEntity(uri, httpEntity, ResponseClass.class);
    
  • 交换()

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

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

我还看到了另一种方法。请对此有所了解。如何以及何时使用它。execute()


答案 1

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

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

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

请注意,也可以作为传递。uriVariablesMap

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

  • 第一个和第二个参数允许 URL 和方法的任何有效组合。
  • 可以通过在发送请求之前传递自定义(仅使用一个方法)来以各种不同的方式修改请求。RequestCallback@FunctionalInterfacedoWithRequest(ClientHttpRequest request)
  • 通过传递自定义,可以以任何必要的方式反序列化从远程资源返回的响应。ResponseExtractor

将此与交换进行比较:

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

这里有两个主要区别:

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

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

getForEntitypostForEntity这样的方法更短,更容易理解:

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

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

请注意,现在允许您在没有包装器的情况下直接发布任何内容。使用它们而不是 ,因为它们在引擎盖下称自己为 - 这只是一个方便的问题。postForEntityObjectexecuteexecute


答案 2

RestTemplate 是一个用于执行 HTTP 请求的同步客户端。它为每个 HTTP 方法的常见方案提供了模板,此外还提供了支持不太常见情况的通用和方法。exchange(...)execute(...)

Spring集成文档总结了每种方法的用法:

postForEntity

通过 创建新资源,并从响应中返回表示形式。POST

exchange

上述方法的更通用,更少固执己见的版本,在需要时提供额外的灵活性。它接受 ,包括 HTTP 方法、URL、标头和正文作为输入,并返回 .RequestEntityResponseEntity

这些方法允许使用 而不是使用泛型指定响应类型。ParameterizedTypeReferenceClass

execute

执行请求的最通用方式,通过回调接口完全控制请求准备和响应提取。


最后,和 方法都将调用受保护的 doExecute(...) 方法,该方法将执行实际的 HTTP 请求。您可以查看源代码以获取详细信息postForEntity(...)exchange(...)execute(...)


推荐