30 Mart 2020 Pazartesi

SpringMVC RestTemplate postForEntity metodu - Form veya JSON Post Eder

Giriş
Http Post ile belirtilen sınıfı gönderir. 
- Birinci paramtre hedef url
- İkinci parametre data + header bilgisi içeren HttpEntity nesnesi
- Üçüncü parametre döndürülecek sonuç nesnesinin T tipidir. Yani Sonuç ResponseEntity<T> tipindendir. Dönüş tipi ResponseEntity<MsToken>, ResponseEntity<String> gibi bir şey olabilir

Örnek - Form Post Etmek
Login olmak için şöyle yaparız. Data MultiValueMap içine doldurulur. Dönüş tipi String
HttpHeaders httpHeaders = new HttpHeaders(); //Headers
httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

MultiValueMap<String,Object> parameters = new LinkedMultiValueMap<> (); //Data
parameters.add("username",username);
parameters.add("password",password);
parameters.add("remember-me",true);

HttpEntity<MultiValueMap<String,Object>> httpEntity = new HttpEntity (parameters,httpHeaders);
RestTemplate restTemplate = new RestTemplate();
try{
  ResponseEntity<String> responseEntity = restTemplate.postForEntity ("http:.../login",httpEntity,String.class);
  HttpHeaders header = responseEntity.getHeaders();
  ...
} catch(RestClientException ex){
  ...
}
Örnek - Form Post Etmek
Şöyle yaparız
private MsToken getToken() { // create client final RestTemplate restTemplate = new RestTemplate(); // prepare header final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); // prepare form data final MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("grant_type", "client_credentials"); map.add("client_id", appId); map.add("client_secret", appPassword); map.add("scope", "https://api.botframework.com/.default"); // prepare request final HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map,headers); // execute call final ResponseEntity<MsToken> response = restTemplate .postForEntity(MS_LOGIN_URL, request, MsToken.class); return response.getBody(); }
Örnek - MULTIPART_FORM_DATA Post Etmek
Şöyle yaparız. Data MultiValueMap içine doldurulur
public void postData(String firstname, String lastname, String fileName,
byte[] fileContents) {

  HttpHeaders headers = new HttpHeaders();
  // Set Content Type to multipart/form-data
  headers.setContentType(MediaType.MULTIPART_FORM_DATA);

  MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
  try {
    // Put form data
    data.add("firstname", firstname); //1
    data.add("lastname", lastname);   //2

    // Put image data
    ByteArrayResource fileData = new ByteArrayResource(fileContents) {
      // This override is required because the default method returns null.
      @Override
      public String getFilename() {
return fileName;
      }
    };
    HttpHeaders parts = new HttpHeaders();
    final HttpEntity<ByteArrayResource> imageEntity = new HttpEntity<>(fileData, parts);
    data.add("image", imageEntity); //3

    // POST form data
    HttpEntity<MultiValueMap<String, Object>> requestEntity =
new HttpEntity<>(data, headers);
    restTemplate.postForEntity(applicationProperties.getDocumentUploadUri(),
requestEntity, String.class);

  } catch (Exception e) {
    e.printStackTrace();
  }
}
Örnek - JSON Post Etmek
Boş bir json post göndermek için şöyle yaparız. Burada ResponseEntity<String> olarak kodladık. Karşı taraf ise boolean dönüyor. ResponseEntity nesnesinin body metodu "true" veya "false" değeri taşır.
String destinationPort = "8090";

RestTemplate restTemplate = new RestTemplate();

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<> (httpHeaders);

String url ="http://localhost:{port}/foo/bar"
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url,entity,
  String.class,destinationPort);
if (responseEntit.getStatusCode() == HttpStatus.OK){
  ...
}
Bu kod @RequestParam veya @RequestBody verisi göndermez. Şu kodu tetikler
@PostMapping(value="bar")
public boolean bar(){ 
...
}
Aynı şeyi exchange() ile yapmak isteseydik şöyle yapardık
ResponseEntity<String> responseEntity = restTemplate.exchange(url,HttpMethod.POST,entity,
  String.class,destinationPort);

Hiç yorum yok:

Yorum Gönder