Tuesday, September 16, 2014

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 !

No comments:

Post a Comment