Showing posts with label web service. Show all posts
Showing posts with label web service. Show all posts

Sunday, March 19, 2017

Currency Conversion With Gson

Pada kesempatan kali ini saya akan mencoba menuliskan cara mendapatkan kurs nilai tukar mata uang dengan menggunakan java dan gson sebagai library nya. 

Apa itu gson? gson adalah library yang diciptakan oleh si mbah google yang berfungsi untuk mengubah objek java menjadi sebuah objek json. 

Use case yang saya ambil adalah bagaimana mendapatkan informasi nilai tukar mata uang atau currency conversion dengan menggunakan API Provider http://api.fixer.io/

Karena kita menggunakan gson sebagai library tambahan, maka pastikan kalian sudah memiliki library tersebut, jika tidak kalian dapat men-download gson pada link berikut https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.0

Untuk melakukan konversi nilai tukar mata uang kita harus mendapatkan nilai rate-nya terlebih dahulu kemudian di-kalikan dengan nilai ammount, kita tidak perlu report memikirkan darimana datangnya hasil nilai rate, karena kita cukup menggunakan API Provider http://api.fixer.io/ yang sudah disediakan oleh google.

Berikut adalah contoh java untuk currency conversion

CurrencyConversionResponse.java

package gsontest;

import java.util.Map;
import java.util.TreeMap;


public class CurrencyConversionResponse {

 private String base;
 private String date;

 private Map rates = new TreeMap();

 public Map getRates() {
  return rates;
 }

 public void setRates(Map rates) {
  this.rates = rates;
 }

 public String getBase() {
  return base;
 }

 public void setBase(String base) {
  this.base = base;
 }

 public String getDate() {
  return date;
 }

 public void setDate(String date) {
  this.date = date;
 }

}




CurrencyConvertor.java

package gsontest;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

import com.google.gson.Gson;

public class CurrencyConvertor {

 private static final String API_PROVDIER = "http://api.fixer.io/";

 public static double convert(String fromCurrencyCode, String toCurrencyCode) {

 if ((fromCurrencyCode != null && !fromCurrencyCode.isEmpty())
   && (toCurrencyCode != null && !toCurrencyCode.isEmpty())) {

  CurrencyConversionResponse response = 
   getResponse(API_PROVDIER + "/latest?base=" + fromCurrencyCode);

  if (response != null) {

   String rate = response.getRates().get(toCurrencyCode);

   double conversionRate = 
     Double.valueOf((rate != null) ? rate : "0.0");

   return conversionRate;
  }

 }

  return 0.0;
 }

 private static CurrencyConversionResponse getResponse(String strUrl) {

  CurrencyConversionResponse response = null;

  Gson gson = new Gson();
  StringBuffer sb = new StringBuffer();

  if (strUrl == null || strUrl.isEmpty()) {

   System.out.println("Application Error");
   return null;
  }

  URL url;
  try {
   url = new URL(strUrl);

   HttpURLConnection connection = 
     (HttpURLConnection) url.openConnection();

   InputStream stream = connection.getInputStream();

   int data = stream.read();

   while (data != -1) {

    sb.append((char) data);

    data = stream.read();
   }

   stream.close();

   response = gson.fromJson(sb.toString(), 
     CurrencyConversionResponse.class);

  } catch (MalformedURLException e) {

   System.out.println(e.getMessage());
   e.printStackTrace();

  } catch (IOException e) {

   System.out.println(e.getMessage());
   e.printStackTrace();
  }

  return response;
 }

 public static void main(String[] args) throws IOException {

  Scanner scanner = new Scanner(System.in);

  System.out.println("Enter the currency code ?");
  String fromCurrencyCode = scanner.next();

  System.out.println("Enter the Amount value:");
  double amount = scanner.nextDouble();

  System.out.println("Enter the Currency Code that you want to covert : ");
  String toCurrencyCode = scanner.next();

  fromCurrencyCode = fromCurrencyCode.toUpperCase();
  toCurrencyCode = toCurrencyCode.toUpperCase();
  
  double coversionRate = convert(fromCurrencyCode, toCurrencyCode);

  System.out.println(amount + " " + fromCurrencyCode + 
    " is equivalent to " + (coversionRate * amount) + " "
    + toCurrencyCode + " today.");

  scanner.close();
 }

}




Berikut hasil dari hasil currency conversion dari USD ke IDR


Kalian juga dapat melakukan currency conversion dengan soap service pada wsdl berikut http://www.webservicex.net/CurrencyConvertor.asmx

Berikut hasil currency conversion jika service tersebut kita coba jalankan dengan menggunakan soap-UI


Demikian blog saya kali ini, untuk referensi terkait blog ini dapat juga dilihat pada link berikut, see ya..


Tuesday, June 14, 2016

Register WSDL SOAP API via Policy Studio di OAG

Setelah sebelumnya kita sudah berhasil membuat filter "IP Address" dan "Throttling" menggunakan policy healthcheck, sekarang kita akan coba mendaftarkan SOAP web service ke OAG dengan menggunakan policy studio.

Untuk lebih jelasnya simak dan ikuti langkah-langkah berikut:
  1. Buka console policy studio, secara default akan seperti gambar di bawah
  2. Persiapkan wsdl yang akan kita daftarkan ke dalam OAG. Kita bisa menggunakan global weather wsdl atau bisa menggunakan wsdl yang kita pernah miliki sendiri. Untuk global weather dapat dilihat di url berikut http://www.webservicex.com/globalweather.asmx?wsdl
  3. Kembali ke policy studio, plih Business Services --> Web Service Repository --> Web Services --> Register Web Service
  4. Akan muncul halaman Load WSDL, kemudian inputkan WSDL URL sesuai dengan url yang ada di langkah no 2, kemudian pilih Next
  5. Klik button Select All untuk memilih semua WSDL operations
  6. Klik Next pada langkah WS-Policy Options
  7. Pada langkah Deploy Policy, kita akan menentukan policy wsdl global weather akan di deploy ke path yang mana, pilih Default Services agar wsdl tersebut nanti diakses dari port 8080 
  8. Akan muncul halaman summary dari hasil deploy wsdl yang sudah kita lakukan sebelumnya
  9. Setelah proses deploy berhasil maka secara otomatis OAG akan men-generate beberapa komponen seperti berikut:
    • path policy location yang ada di Listener --> Oracle API Gateway --> Default Services --> path
    • Global weather Web Services yang ada di Business Service --> Web Service Repository --> Web Services --> GlobalWeather
    • Global weather policy yang ada di Policies --> Generated Policies --> Web Services.GlobalWeather --> /globalweather.asmx
  10. Langkah terakhir adalah deploy dengan cara klik F6 atau klik tombol pojok kanan atas
  11. Test untuk melihat hasil nya dengan cara http://ip:port/globalweather.asmx?wsdl
Akhirnya kita telah berhasil untuk mendaftarkan wsdl SOAP ke OAG, wsdl global weather juga sudah dapat diakses melalui OAG. Kita dapat menambahkan beberapa filter untuk memproteksi service tersebut sesui dengan kebutuhan. Contoh proteksi service sudah pernah kita bahas sebelumnya di link blog berikut http://blog.nostratech.com/2016/06/membuat-filter-ip-address-dan.html

Semoga informasi ini dapat bermanfaat :)

Terimakasih.

Referensi : https://www.youtube.com/watch?v=-lRIB9iV_ac

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.



RESTful Web-Service dengan JAX-RS

REST (Representational State Transfer) merupakan gaya arsitektur web service berbasis protokol HTTP. Pertama kali diutarakan oleh Roy Fielding pada tesis nya di tahun 2000. REST di gunakan sebagai prinsip dasar untuk transfer data secara stateless pada data yang dapat di akses menggunakan protokol HTTP.

Pada arsitektur REST, data merupakan resource yang dapat di akses melalui metode-metode standar HTTP seperti GET, POST, PUT, DELETE. Masing-masing metode HTTP ini di gunakan untuk mendapatkan (retrieve) ataupun memanipulasi resource. GET digunakan untuk mengambil resource, PUT untuk menambah (insert) resource, POST digunakan untuk memodifikasi (update) resource, dan DELETE untuk membuang resource.

Tidak seperti SOAP yang mengharuskan memakai XML sebagai format data, dan memiliki struktur format yang tetap (fixed), setiap data pada REST dapat di representasikan dalam berbagai format, antara lain teks, XML, JSON, dll. Namun begitu JSON adalah format data yang paling sering di pakai pada implementasi web service menggunakan REST.

Beberapa keuntungan REST dibandingkan dengan SOAP adalah:
Lebih sederhana, hanya memakai protokol HTTP biasa, tidak memerlukan struktur data khusus.
Lebih Performa dan Scalable, hanya data saja yang di transfer tidak ada overhead seperti pada SOAP.

Hal ini tidaklah menjadikan REST lebih baik dari SOAP, dalam beberapa kasus, di mana komunikasi antar web service adalah stateful dan di haruskan berada dalam satu transaksi, SOAP lebih tepat untuk di gunakan karena sudah menyediakan fitur-fitur untuk meng-implementasikannya dengan mudah. Namun, jika anda ingin sekedar berbagi data secara sederhana atau membuat CRUD service (Create, Read, Update, Delete), maka REST merupakan pilihan yang lebih tepat.

Java men-support REST melalui JSR-311, yang di namakan JAX-RS (Java API for RESTful Web Services). Adapun reference implementation dari JAX-RS sendiri adalah Jersey. Beberapa implementasi lainnya adalah:
- Apache CXF
- RESTEasy (JBoss)
- Restlet

Saya akan menjelaskan cara membuat REST service sederhana menggunakan JAX-RS dengan bantuan Eclipse IDE dan Maven. Aplikasi yang di buat dengan JAX-RS dapat berjalan pada JavaEE application server maupun servlet container biasa, oleh karena itu, pembahasan langkah-langkah pembuatan di bagi berdasarkan konteks deployment nya. Sebagai contoh saya menggunakan Glassfish 3.1 dan Tomcat 7.

Persiapan

Eclipse IDE

Jika Eclipse IDE anda belum mempunyai Maven support, maka anda harus terlebih dahulu meng-install plugin m2e dan m2e-wtp, jika anda memakai Eclipse Juno seperti saya maka anda dapat memakai update site berikut:

m2e: http://download.eclipse.org/technology/m2e/releases
m2e-wtp: http://download.eclipse.org/m2e-wtp/releases/juno


Glassfish

Anda dapat mengunduh glassfish disini dan menginstall nya secara manual. Atau jika anda pengguna linux dapat menginstall melalui package manager sesuai distro masing-masing.

Install juga GlassFish Tools for Eclipse agar dapat menjalankan dan men-deploy aplikasi ke dari Eclipse. Untuk panduan instalasi bisa cek disini.

Tomcat

Anda dapat mengunduh tomcat disini dan menginstall nya secara manual. Atau jika anda pengguna linux dapat menginstall melalui package manager sesuai distro masing-masing.

Eclipse sudah men-support Tomcat out of the box jadi anda tidak perlu menginstall plugin khusus.

1. JavaEE Application Server - Glassfish

Seperti yang sudah di jelaskan di atas, Jersey adalah reference implementation dari JAX-RS. Jika anda menggunakan glassfish, maka Jersey sudah tersedia, karena JAX-RS merupakan bagian dari Java Enterprise Edition (JavaEE), dan glassfish adalah application server yang men-support penuh JavaEE dan menggunakan Jersey sebagai implementasi JAX-RS nya.

Pastikan plugin Maven untuk Eclipse & Glassfish sudah ter-install, jika belum ikuti tahap Persiapan di atas. Buat project maven baru dengan Eclipse:

File -> New -> Other -> Maven Project. Ketik "webapp" pada filter. Pilih maven-archtype-webapp pada hasil pencarian yang muncul di bawah nya.


Isi parameter project pada halaman selanjutnya dan klik Finish.


Tambahkan dependency ke JAX-RS API di pom.xml

<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependencies>


Agar glassfish mengenali aplikasi kita sebagai aplikasi JAX-RS maka kita harus mambuat subclass yang meng-extend javax.ws.rs.core.Application serta meng-anotasi kan nya dengan @ApplicationPath


Untuk itu disini saya membuat class HelloApplication.java, yang saya berikan anotasi @ApplicationPath dengan parameter "/rest" di mana ini akan menjadi base url dari aplikasi

Tahap selanjutnya adalah membuat resource (dalam terminologi REST), yang merupakan service endpoint.

Buat class baru bernama HelloResource dengan isi sebagai berikut

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource {

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{name}")
public String sayHello(@PathParam("name") String name) {
return "Hello, " + name;
}


}

Class ini memiliki method sayHello yang di berikan anotasi-anotasi JAX-RS. @GET berarti method ini akan me-respon pada get request. @PathParam & @Param merupakan satu kesatuan, nama parameter yang di berikan pada @PathParam harus persis sama dengan yang di letakkan pada @Path di dalam kurung-kurawal. @PathParam mengharapkan request yang datang memiliki parameter pada request path nya. Contoh, ketika client melakukan request ke "/rest/hello/world", "world" akan menjadi parameter untuk method sayHello@Produces menginstruksikan JAX-RS untuk membuat representasi sesuai format data yang di berikan, dalam kasus ini "plain text" atau teks biasa.


Yupz!, selesai sudah aplikasi JAX-RS kita yang sangat sederhana ini. Untuk men-deploy-nya ke glassfish klik kanan pada project -> Run As -> Run On Server -> Pilih Glassfish (Jika tidak terdapat pilihan seperti pada gambar maka anda harus membuatnya terlebih dahulu, dengan memilih "Manually define a new server")


Tampilan saat di jalankan:


2. Servlet Container - Tomcat

Jersey juga dapat bekerja sebagai servlet yang berjalan pada servlet container seperti Tomcat. Jersey akan meng-scan semua class yang sudah di definisikan sebagai RESTful resource, menganalisa HTTP request yang datang dan memilih class yang tepat untuk membuat response.

Pastikan plugin Maven untuk Eclipse & Tomcat sudah ter-install, jika belum ikuti tahap Persiapan di atas. Buat project maven baru dengan Eclipse:

File -> New -> Other -> Maven Project. Ketik "webapp" pada filter. Pilih maven-archtype-webapp pada hasil pencarian yang muncul di bawah nya.


Isi parameter project pada halaman selanjutnya dan klik Finish.


Tambahkan dependency ke Jersey Container Servlet di pom.xml

<dependencies>
    <dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.12</version>
<scope>compile</scope>

    </dependency>
</dependencies>

Setup Jersey sebagai servlet di web.xml

<servlet>
        <servlet-name>MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>org.hello.rest</param-value>
</init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>

    </servlet-mapping>

Jika anda perhatikan saya memberikan init parameter dengan nama jersey.config.server.provider.packages, dan memberikan value berupa package di mana class resource berada. Jersey akan melakukan scanning pada package ini dan me-register semua resource yang di dapat secara otomatis.


Lakukan langkah untuk membuat class resource HelloResource seperti yang terdapat pada langkah sebelumnya.

Aplikasi sudah siap untuk di deploy di Tomcat:



Saat anda jalankan anda akan mendapati hasil yang sama dengan saat menjalankannya di Glassfish:


Data dengan format JSON


Untuk membuat response dengan format data JSON di perlukan JAXB (Jaxa API for XML Binding).

Tambahkan dependency ke JAXB API di pom.xml

<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

Sebagai contoh anda dapat membuat resource class dengan isi sebagai berikut:

@Path("/fruits")
public class FruitResource {

private final List<Fruit> fruits;

public FruitResource() {
fruits = new ArrayList<Fruit>();
fruits.add(new Fruit("Apple", 10.25));
fruits.add(new Fruit("Orange", 7.11));
fruits.add(new Fruit("Grape", 9.37));
}

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/list")
public List<Fruit> listFruits() {
return fruits;
}

@XmlRootElement()
static class Fruit {
String name;
double price;

public Fruit(){}

public Fruit(String name, double price){
this.name = name;
this.price = price;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}

Hasilnya saat di jalankan:


Sangat mudah bukan membuat RESTful service dengan JAX-RS :)

Demikian, semoga bermanfaat !