Я работаю над Rest API, используя Spring boot, и мне пришлось получить доступ к конечной точке приложения. Я использовал для этого RestTemplate. Я смог сделать это двумя способами,
postForEntity():
responseEntity =
restTemplate.postForEntity(uri, httpEntity, ResponseClass.class);
exchange():
responseEntity =
restTemplate.exchange(uri, HttpMethod.POST, httpEntity, ResponseClass.class);
Я хотел бы узнать об использовании и различиях этих двух методов.
Еще я вижу другой метод execute(). Пожалуйста, пролей на это немного света. Как и когда его использовать.




Если вы посмотрите на реализацию как postForEntity, так и метода exchange, вы увидите, что оба используют методы выполнения в задней части. Использование метода обмена даст вам больше свободы для вызова различных методов http.
RestTemplate - это клиент синхронный для выполнения HTTP-запросов. Он предлагает шаблоны для общих сценариев для каждого метода HTTP в дополнение к обобщенным методам exchange(...) и execute(...), которые поддерживают менее частые случаи.
Документация по интеграции Spring суммирует использование каждого метода:
postForEntityCreate a new resource via
POSTand return the representation from the response.
exchangeMore generalized, and less opinionated version, of the above methods that provides extra flexibility when needed. It accepts
RequestEntity, including HTTP method, URL, headers, and body as input, and returns aResponseEntity.These methods allow the use of
ParameterizedTypeReferenceinstead ofClassto specify a response type with generics.
executeThe most generalized way to perform a request, with full control over request preparation and response extraction via callback interfaces.
В конце концов, оба метода postForEntity(...), exchange(...) и execute(...) вызовут защищенный метод doExecute(...), который будет выполнять фактический HTTP-запрос. Вы можете проверить исходный код для подробностей
RestTemplate - очень универсальный объект.
Начнем с execute, так как это наиболее общий метод:
execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)
Обратите внимание, что uriVariables также может передаваться как Map.
execute разработан для применения в самых разнообразных возможных сценариях:
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 теперь позволяет отправлять любой Object напрямую без оболочки. Использование этих дисков вместо execute не дает ни преимущества в производительности, ни ущерба, поскольку они сами называют себя execute - это просто вопрос удобства.
Выполнять(..) Самый простой способ сделать вызов REST.
Обмен(..) Обертка над методом Execute.
PostForEntity (..) Метод-оболочка, который еще больше упрощает использование вызовов REST. Вы указываете тип запроса в самом имени метода (getForEntity, postForEntity), поэтому, не нужно указывать тип запроса в параметре. Само по себе название метода говорит само за себя.
В Обмен и postForEntity ответ должен быть в Форматы Json. Этот Json далее преобразуется в класс Model библиотеками json-mapper. В то время как в Выполнять мы принимаем ответ в любой формат, поскольку мы передаем десериализатор в аргументе Response Executor.