22 Aralık 2019 Pazar

SpringMVC RestTemplate exchange metodu

Giriş
exchange() metodunun bir sürü overload edilmiş hali var.
Bunlar arasındaki temel fark şöyle
1. Bazı overload edilmiş metodlar ResponseType olarak Class kullanıyor, bazılarıysa ParameterizedTypeReference kullanıyor
2.  Bazı overload edilmiş metodlar uriVariables alıyor. uriVariables array veya Map olarak geçilebilir.
3.  Bazı overload edilmiş metodlar url yerine RequestEntity alıyorlar. 

exchange() vs getForEntity()
getForEntity() ile GET isteği gönderip sonuç tipini belirtmek mümkün. Ancak exchange() metodunu kullanırken özellikle ikinci overload edilmiş haliyle HttpEntity nesnesi içinde Http isteğinin body kısmını göndermek te mümkün. 

exchange () ve execute() metodu
execute() metodu ile farkının açıklaması şöyle. Bir HttpEntity gönderme ve istenilen Class tipinden sonuç olma imkanı var.
There are two major differences here:

- You can now pass an HttpEntity directly, whereas before it needed to be set manually using the RequestCallback.
- Deserialization mechanics are provided out of the box by passing the desired response type Class.

1. exchange metodu - RequestEntity + ResponseType Olarak ParameterizedTypeReference
İmzası şöyleResponseEntity nesnesi döner. url, http istek türü (get,post) ve geri kalan her şey RequestEntity nesnesine doldurulur.
@Override
public <T> ResponseEntity<T> exchange(RequestEntity<?> requestEntity,
  ParameterizedTypeReference<T> responseType)
throws RestClientException
getForEntity() metodu yerine kullanılabilir. 

2. exchange metodu - url + HttpMethod + HttpEntity + ResponseType Olarak Class
İmzası şöyle. List<String> gibi bir liste çekmek için kullanılır.İmzası şöyle.
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
         Class<T> responseType)
Örnek
Exception'ı yakalamak için şöyle yaparız.
try {
  restTemplate.exchange(...);
} catch (HttpStatusCodeException e) {
  return new ResponseEntity<>(e.getResponseBodyAsString(), e.getStatusCode());
}
Örnek
Json String sonuç için şöyle yaparız
RestTemplate restTemplate = new RestTemplate();
String url="http://<Domain>:8085/users/active";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>("header",headers);
ResponseEntity<String> responseEntity = restTemplate.exchange( url, HttpMethod.GET,
  entity, String.class );
Örnek - GET
String sonuç için şöyle yaparız.
UriComponentsBuilder builder = ...

ResponseEntity<String> responseEntity = restTemplate
  .exchange(builder.toUriString() , HttpMethod.GET, null, String.class);
Örnek - GET
Json String sonuç için şöyle yaparız.
HttpEntity<Object> httpEntity = ...;
restTemplate.exchange(URL, HttpMethod.GET, httpEntity, String.class)
Örnek - GET
Resource sonuç için şöyle yaparız.
ResponseEntity<Resource> responseEntity = restTemplate.exchange(someUrlString,

  HttpMethod.GET, entity, Resource.class);
Örnek - POST
Şöyle yaparız.
HttpEntity<String> entity = new HttpEntity<>(requestBody, requestHeaders); 

restTemplate.exchange("http://localhost:8080/context-path/resource",
  HttpMethod.POST, entity, String.class);
3. exchange metodu - url + HttpMethod + HttpEntity + ResponseType Olarak ParameterizedTypeReference
Örnek
Şöyle yaparız
String response = restTemplate.exchange("http://...",
                        HttpMethod.GET,
                        null,
                        new ParameterizedTypeReference<String>() {},
                        "")
  .getBody();
Örnek - GET
List<String> sonuç için şöyle yaparız. Burada HttpEntity null veriliyor Yani Http isteğinin body'si içinde göderecek bir şey yok.
ResponseEntity<List<String>> responseEntity =
        restTemplate.exchange("localhost:8083/connectors/",
            HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() {
            });
List<String> listOfString = responseEntity.getBody();
4. exchange metodu - url + HttpMethod + HttpEntity + ResponseType Olarak Class + PathVariables
İmzası şöyle.
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
         Class<T> responseType, Object... uriVariables)
url haricinde path değişkenleri varsa kullanılır
restTemplate.exchange(url, method, requestEntity, responseType, pathVariables);

Hiç yorum yok:

Yorum Gönder