Tuesday, September 16, 2014

REST Web Service Client menggunakan RestTemplate

Bagaimana untuk request ke sebuah Rest API dan mendapatkan hasilnya ?
Kalau di Java pada umumnya untuk memanggil ke Rest API digunakan class http client.

Misalnya ada Rest API seperti ini : http://host-01:8099/customer/271650
Return value berupa JSON seperti berikut ini :
 {  
 id: 271650,  
 name: "derp",  
 phone: "085635231",  
 email: "derp@herp.co.id",  
 corporateId: null,  
 voucherBalance: 0  
 }  

Nah, bagaimana caranya untuk mendapatkan data JSON tersebut agar bisa diolah lebih lanjut di class class lainnya.

Salah satu caranya kita bisa menggunakan class HttpURLConnection().
Berikut ini contohnya :
 package com.nostratech.app;  
 import java.io.BufferedReader;  
 import java.io.IOException;  
 import java.io.InputStreamReader;  
 import java.net.HttpURLConnection;  
 import java.net.MalformedURLException;  
 import java.net.URL;  
 public class SampleHttpClient {  
      public static void main(String[] args) {  
           try {  
                URL url = new URL(  
                          "http://host-01:8099/customer/271650/");  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                conn.setRequestMethod("GET");  
                conn.setRequestProperty("Accept", "application/json");  
                if (conn.getResponseCode() != 302 && conn.getResponseCode() != 200) {  
                     throw new RuntimeException("Failed : HTTP error code : "  
                               + conn.getResponseCode() + conn.getResponseMessage());  
                }  
                BufferedReader br = new BufferedReader(new InputStreamReader(  
                          (conn.getInputStream())));  
                String output;  
                System.out.println("JSON response : \n");  
                while ((output = br.readLine()) != null) {  
                     System.out.println(output);  
                }  
                conn.disconnect();  
           } catch (MalformedURLException e) {  
                e.printStackTrace();  
           } catch (IOException e) {  
                e.printStackTrace();  
           }  
      }  
 }  

Responsenya akan berupa string JSON, yang seperti ini.


Kemudian string json ini harus kita parsing manual satu per satu agar kita olah lagi.
Tentu hal ini akan terasa lebih rumit dan agak memakan waktu.

Salah satu cara untuk mempermudah request dan parsing json dari Rest API, adalah menggunakan library tambahan RestTemplate dari Spring Framework. Sebenarnya library ini digunakan di android project, tetapi bisa juga digunakan di Java project lainnya.

RestTemplate ini sudah mensupport hampir semua Http Method yang biasa digunakan di Rest API (POST, PUT, DELETE, GET dan lain-lain).

Langkahnya sangat mudah.
Tinggal tambahkan library (spring web dan core) ini ke java project kita (bisa didownload di sini ) :
spring-core-4.0.7.RELEASE.jar
spring-web-4.0.7.RELEASE.jar

Jangan lupa tambahkan juga library Jackson (download di sini). digunakan untuk parsing atau marshalling json resultnya.
jackson-annotations-2.3.2.jar (link)
jackson-core-2.3.2.jar (link)
jackson-mapper-asl-1.9.13.jar (link)

tambahkan class common-logging : commons-logging-1.1.3.jar (link)

Kita harus tahu dulu bagaimana format json responsenya. Kemudian dibuat class mappingnya (contohnya class : Customer) yang digunakan sebagai object hasil mapping json resultnya.
Atribut atributnya disamakan dengan json response, karena akan digunakan sebagai mapping
 package com.nostratech.app;  
 import java.math.BigDecimal;  
 public class Customer {  
      private Integer id;  
      private String name;  
      private String phone;  
      private String email;  
      private Integer corporateId;  
      private BigDecimal voucherBalance;  
      public Integer getId() {  
           return id;  
      }  
      public void setId(Integer id) {  
           this.id = id;  
      }  
      public String getName() {  
           return name;  
      }  
      public void setName(String name) {  
           this.name = name;  
      }  
      public String getPhone() {  
           return phone;  
      }  
      public void setPhone(String phone) {  
           this.phone = phone;  
      }  
      public String getEmail() {  
           return email;  
      }  
      public void setEmail(String email) {  
           this.email = email;  
      }  
      public Integer getCorporateId() {  
           return corporateId;  
      }  
      public void setCorporateId(Integer corporateId) {  
           this.corporateId = corporateId;  
      }  
      public BigDecimal getVoucherBalance() {  
           return voucherBalance;  
      }  
      public void setVoucherBalance(BigDecimal voucherBalance) {  
           this.voucherBalance = voucherBalance;  
      }  
      @Override  
      public String toString() {  
           return "Customer [id=" + id + ", name=" + name + ", phone=" + phone  
                     + ", email=" + email + ", corporateId=" + corporateId  
                     + ", voucherBalance=" + voucherBalance + "]";  
      }  
 }  

Kemudian kita buat class sample rest client.
Ditambahkan juga MessageConverter untuk convert dari json string ke object.
Kita gunakan MappingJackson2HttpMessageConverter() sebagai converternya.
 package com.nostratech.app;  
 import java.util.ArrayList;  
 import java.util.List;  
 import org.springframework.web.client.RestTemplate;  
 import org.springframework.http.converter.HttpMessageConverter;  
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;  
 public class SampleRestClient {  
      public static void main(String[] args) {  
           String url = "http://host-01:8099/customer/271650";  
           RestTemplate restTemplate = new RestTemplate();  
           List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();  
           messageConverters.add(new MappingJackson2HttpMessageConverter());  
           restTemplate.getMessageConverters().addAll(messageConverters);  
           Customer customer = restTemplate.getForObject(url, Customer.class);  
           System.out.println("Result customer : "+customer);  
      }  
 }  

Hasilnya kurang lebih akan seperti ini setelah di running.
Ouput json sudah menjadi object Customer.


Terima kasih, semoga membantu.

Selamat mencoba.



No comments:

Post a Comment