RestTemplate: exchange () против postForEntity () против execute () - PullRequest
0 голосов
/ 17 сентября 2018

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

  • postForEntity():

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

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

Документация Spring Integration обобщает использованиекаждый метод:

postForEntity

Создать новый ресурс с помощью POST и вернуть представление из ответа.

exchange

Более обобщенная и менее взвешенная версия вышеупомянутых методов, которая обеспечивает дополнительную гибкость при необходимости.Он принимает RequestEntity, включая HTTP-метод, URL, заголовки и тело в качестве входных данных, и возвращает ResponseEntity.

Эти методы позволяют использовать ParameterizedTypeReference вместо Class для указания ответатип с обобщениями.

execute

Наиболее обобщенный способ выполнения запроса с полным контролем над подготовкой запроса и извлечением ответа через интерфейсы обратного вызова.


В конце оба метода postForEntity(...), exchange(...) и execute(...) вызовут защищенный метод doExecute(...), который будет выполнять фактический HTTP-запрос.Вы можете проверить исходный код для деталей

0 голосов
/ 17 сентября 2018

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 под капотом - это просто вопрос удобства.

0 голосов
/ 17 сентября 2018

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

...