我正在使用 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
开箱即用的。
如您所见,这对于日常使用来说更加方便。
像 getForEntity
和 postForEntity
这样的方法甚至更短、更容易理解:
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/