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

Я работаю над Rest API, используя Spring boot, и мне пришлось получить доступ к конечной точке приложения. Я использовал для этого RestTemplate. Я смог сделать это двумя способами,

  • postForEntity():

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

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

Я хотел бы узнать об использовании и различиях этих двух методов.

Еще я вижу другой метод execute(). Пожалуйста, пролей на это немного света. Как и когда его использовать.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
26
0
37 999
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы посмотрите на реализацию как postForEntity, так и метода exchange, вы увидите, что оба используют методы выполнения в задней части. Использование метода обмена даст вам больше свободы для вызова различных методов http.

RestTemplate - это клиент синхронный для выполнения HTTP-запросов. Он предлагает шаблоны для общих сценариев для каждого метода HTTP в дополнение к обобщенным методам exchange(...) и execute(...), которые поддерживают менее частые случаи.

Документация по интеграции Spring суммирует использование каждого метода:

postForEntity

Create a new resource via POST and return the representation from the response.

exchange

More 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 a ResponseEntity.

These methods allow the use of ParameterizedTypeReference instead of Class to specify a response type with generics.

execute

The 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 разработан для применения в самых разнообразных возможных сценариях:

  • Первый и второй параметры допускают любую допустимую комбинацию 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 теперь позволяет отправлять любой Object напрямую без оболочки. Использование этих дисков вместо execute не дает ни преимущества в производительности, ни ущерба, поскольку они сами называют себя execute - это просто вопрос удобства.

Выполнять(..) Самый простой способ сделать вызов REST.

Обмен(..) Обертка над методом Execute.

PostForEntity (..) Метод-оболочка, который еще больше упрощает использование вызовов REST. Вы указываете тип запроса в самом имени метода (getForEntity, postForEntity), поэтому, не нужно указывать тип запроса в параметре. Само по себе название метода говорит само за себя.

В Обмен и postForEntity ответ должен быть в Форматы Json. Этот Json далее преобразуется в класс Model библиотеками json-mapper. В то время как в Выполнять мы принимаем ответ в любой формат, поскольку мы передаем десериализатор в аргументе Response Executor.

Другие вопросы по теме