Tugaas pemograman 3 1100631034

38
Tugas Pemrograman III Essay Mengenai RPC (Remote Procedur Call), SOAP (Simple Object Access Protocol), Dan REST (Representational State Transfer) Oleh : SITI ARBA’IYAH 1100631034 JURUSAN MANAJEMEN INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS MUHAMMADIYAH JEMBER 2013

description

 

Transcript of Tugaas pemograman 3 1100631034

Page 1: Tugaas pemograman 3   1100631034

Tugas Pemrograman III

Essay Mengenai RPC (Remote Procedur Call), SOAP (Simple Object Access Protocol), Dan REST (Representational State Transfer)

Oleh :

SITI ARBA’IYAH 1100631034

JURUSAN MANAJEMEN INFORMATIKA

FAKULTAS TEKNIK

UNIVERSITAS MUHAMMADIYAH JEMBER

2013

Page 2: Tugaas pemograman 3   1100631034

1. Remote Procedure Call (RPC)

Definisi RPC

adalah suatu protokol yang menyediakan suatu mekanisme komuikasi antar proses

yang mengijinkan suatu program untuk berjalan pada suatu komputer tanpa terasa

adanya eksekusi kode sistem yang jauh (remote system).

- RPC digunakan untk membangun aplikasi klien server yang terdistribusi.

- Didasarkan pada memperluas konsep konvensional dari suatu prosedur dimana

nantinya mempunyai alamat sama dengan lokasi prosedur dipanggil.

- RPC mengasumsi keberadaan TCP atau UDP untuk membawa pesan data dalam

komniasi suatu program.

- Protokol RPC dibangun diatas protokol eXternal Data Representasi (XDR) yang

merupakan sandar representasi data dalam komunikasi remote.

- Protokol RPC mengijinkan pengguna untuk bekerja dengan remote sebagaimana

bekerja dengan prosedur lokal.

Protokol Message RPC

•Didefinisikan dengan menggunakan deskripsi data XDR yang meliputi struktur,

enumerasi, dan union.

•Membutuhkan faktor-faktor pendukung :

1. Spesifikasi yang unik untuk tiap procedure call

2. Respon message yang sesuai untuk tiap message yang diminta.

3. Otentifikasi klien untuk tiap layanan

Page 3: Tugaas pemograman 3   1100631034

Struktur Protokol Message RPC

a. Call Message

• Dilakukan oleh klien, dimana meminta server untuk mengeksekusi suatu prosedur.

• Terdapat nilai-nilai unsigned integer yangdigunakan untuk mengidentifikasi prosedur

remote, yang diminta:

1. Nomor Program

2. Nomor Versi dari Program

3. Nomor Prosedur

b. Reply Message

• Dikirimkan oleh server jaringan, bervariasi tergantung apakah call message yang

diminta klien diterima atau ditolak

•Mengandung informasi:

1. RPM mengeksekusi call message dengan sukses

2. Implementasi remote tidak sesuai dengan protokol yang digunakan (versi yang

lebih tinggi atau lebih

rendah ditolak)

3. Program remote tidak tersedia pada sistem remote

4. Program remote tidak mendukung versi yang diminta klien

5. Nomor prosedur yang diminta tidak ada

Fitur dalam RPC

1. Batching Calls

Mengijinkan klien untuk mengirim message calls ke server dalam jumlah besar

secara berurutan.

2. Broadcasting Calls

Menijinkan klien untuk mengirimkan paket data ke jaringan dan menunggu balasan

dari network.

3. Callback Procedures

Mengijinkan server untuk bertindak sebagai klien dan melakukan PRC callback ke

proses yang dijalankan klien.

4. Select Subrutin

Page 4: Tugaas pemograman 3   1100631034

Memeriksa deskripsi suatu file dan messages dalam antrian untuk melihat apakah

siap dibaca atau ditulis, atau ditahan. (mengijinkan server untuk menginterupsi suatu

aktivitas)

Otentifikasi RPC

• Otentifikasi adalah proses yang digunakan untuk mengidentifikasi server dan klien

pada RPC.

• Bagian-bagian otentifikasi RPC, yaitu :

1.Protokol Otentifikasi RPC

2.Otentifikasi NULL

Digunakan pada sistem dimana pemanggil RPC tidak mengetahui identitasnya

sendiri dan server tidak membutuhkan identitas pemanggil

3.Otentifikasi UNIX

Digunakan pada prosedur remote dalam sistem UNIX

4.Otentifikasi Data Encryption Standard

Membutuhkan keyserv daemon yang harus berjalan baik di sisi server maupun

klien.

5. Protokol Otentifikasi DES

Meliputi protokol penanganan DES pada proses otentifikasi RPC.

6. Enkripsi Diffie-Hellman

Digunakan pada pembuatan kunci publik pada otentifikasi DES dengan 192-bit

kunci.

• RPC tidak berhubungan dengan kontrol akses terhadap layanan individual yang

diberikan.

• Subsistem otentifikasi pada paket RPC bersifat open-ended, yaitu beberapa

otentifikasi dapatdiasosiasikan pada RPC klien

Page 5: Tugaas pemograman 3   1100631034

Bahasa RPC

• Merupakan bahasa yang dikembangkan dari bahasa XDR dengan penambahan

program definisi.

• Implementasi layanan protokol dan rutin menggunakan command rpcgen, yang

bekorespondensi denga bahasa C.

Definisi dari bahasa RPC, yaitu :

1. Definition

File dengan bahasa RPC memiliki beberapa definisi, diantaranya adalah : enum,

struct, union, typedef, const, dan program.

2. Structure

Struktur pada bahasa RPC dideklarasikan seperti pada pendeklarasian struktur

dalam bahasa C

3. Union

Union pada bahasa RPC berbeda dengan bahasa C. Kemiripan lebih ditunjukkan

dengan variasi pada bahasa Pascal

4. Enumeration

Enumerasi pada bahasa ini memiliki syntax yang sama dengan bahasa C.

5. TypeDef

Tipe Definisi ( Typedef ) pada bahasa ini memiliki syntax yang sama dengan

typedef pada bahasa C.

6. Constant

Constant pada bahasa ini dapat digunakan jika variabel integer konstant dibutuhkan.

7. Programs

Program RPC dideklarasikan dengan syntax berikut secara berurutan :

programdefiniton, version-list, version, procedure-list, procedure.

8. Declarations

Dalam bahasa ini, terdapat empat jenis tipe deklarasi yaitu : simple

declarations, fixed length array declarations, variable- length declaration, dan pointer

declaration.

Page 6: Tugaas pemograman 3   1100631034

Lapisan RPC

1. Lapisan Tertinggi

• Merupakan lapisan yang bersentuhan langsung dengan sistem operasi, mesin, dan

jaringan tempat RPC berjalan.

• Jenis-jenis servis yang digunakan pada layer ini:

Rutin Description

1. rnusers mengembalikan jumlah user pada sistem remote

2. rusers mengembalikan informasi mengenai user tertentu

3. hevedisk memeriksa keberadaan disk pada mesin remote

4. rstats melihat kinerja dari kernel remote

5. rwall menulis untuk menentukan mesin remote tertentu

6. yppasswd mengupdate password dari user dalam yellow pages

2. Lapisan Menengah

• Merupakan implementasi dari RPC sesungguhnya.

• Layer ini merupakan layer yang digunakan untuk semua program RPC

• Pada layer ini terdapat rutin-rutin mengenai "registerrpc()", "callrpc", dan scv run.

- ”registerrpc() digunakan untuk memperoleh nomor unik dari tiap prosedur

identifikasi dalam tiap sistem.

- ”callrpc()” digunakan untuk mengeksekusi prosedur remote

3. Lapisan Terendah

• Merupakan lapisan yang mengatur tentang socket dan sistem call.

• Lapisan ini tidak memberikan data dan servis secara detail untuk dapat digunakan.

• Umumnya program yang dibuat untuk lapisan ini merupakan program yang paling

efisien.

Model dan Cara Kerja RPC

Page 7: Tugaas pemograman 3   1100631034

Model dan Cara Kerja RPC 2

Implementasi Eksploitasi RPC

• Digunakan beberapa tools untuk melakukan eksploitasi pada RPC.

• Pada contoh kasus ini, implementasi dilakukan pada LAN dengan host yang

menggunakan SO Microsoft Windows XP.

• Tahapan eksekusi Eksploitasi :

1.Deteksi sistem yang memiliki kelemahan

2.Penyerangan terhadap sistem tersebut

3.Eksekusi kode pada sistem yang telah ter-remote

A. Deteksi Sistem

• Tools yang digunakan pada tahap ini adalah RPCScan v.2.03

Page 8: Tugaas pemograman 3   1100631034

• Software ini dapat mendetaksi sistem operasi yang memiliki kelemahan yaitu pada

layanan DCOM (Distributed Component Object Model)

• Sistem yang masih mengaktifkan layanan DCOM akan diberi status ”Vulnerable”

dan sebaliknya akan diberi status ”DCOM Disabled”

• Contoh sistem yang memiliki kelemahan :

B. Eksploitasi Protokol RPC menggunakan Program

• Pada tahap ini akan dilakukan eksploitasi protokol RPC, agar terjadi kekeliruan

penanganan message dari penyerang (host1) ke sistem yang diserang (host2) sehingga

host1 dapat melakukan eksekusi kode pada host2.

• Tools yang digunakan bernama “Kaht” .Program ini akan mengeksploitasi port 135

dari sistem yang terserang.

•Contoh penyerangan :

Page 9: Tugaas pemograman 3   1100631034

• Gambar diatas menyatakan bahwa host1( IP 192.168.0.87) telah berhasil masuk

kedalam sistem remote pada host2 (IP 192.168.0.13). Keberhasilan eksploitasi ini juga

dapat dilihat pada kondisi port-port yang terhubung antara host 21 dan host 2.

• Sebelum tereksploitasi, tidak ada port TCP pada host1 yang terhubung dengan

saipapun. Setelah ekploitasi pada host 2 berhasil dilakukan, maka terlihat bahwa pada

port 135 terjadi koneksi / koneksi sedang berjalan dan tersambung ( Figure 3.3).

Dengan demikian, maka pengeksekusian kode pada host2 oleh host1 dapat dilakukan.

• Sampai tahap ini, host1 hanya merupakan user dengan hak biasa saja.

• Berikutnya adalah implementasi pengeksekusian kode misalnya membuat account

user baru dengan hak administrator.

- Sebelum dan Sesudah Eksploitasi :

C. Eksekusi Kode

• Tahap ini merupakan tahap eksekusi kode yang diinginkan. Pada tahap ini host1

dapat melakukan apa saja. Pada contoh kasus ini akan dicoba untuk membuat sebuah

account baru dengan hak seorang admin.

• Setelah masuk pada sistem host2, maka gunakan perintah berikut untuk

mengeksekusi pembuatan user baru : net user tom2 /add.

• Kemudian hak user ini diubah menjadi hak Administrator : net localgroup

Administrators tom2 /add

Page 10: Tugaas pemograman 3   1100631034

• Dengan demikian pada host2 akan didapatkan satu user baru bernama "tom2"

dengan hak seorang administrator.

Pencegahan Eksploitasi RPC

• Beberapa cara pencegahannya:

1. Memblokir port 135, 137, 138 dan 445 pada UDP dan port 135, 149, 445, dan 593

pada TCP melalui Firewall. Disfungsikan COM Internet Services ( CIS ) dan

RPC melalui HTTP yang menggunakan port 80 dan 443 terutama pada jaringan

remote yang menggunakan VPN ( Virtual Private Network ) atau sejenisnya.

2. Gunakan personal Firewall seperti Internet Connection Firewall.

3. Blokir semua port sering diekploitasi dengan menggunakan filter IPSEC.

4. Disfungsikan fitur DCOM pada setiap komputer atau server. Disable DCOM on all

affected machines

5. Khusus Sistem operasi buatan Microsoft, selalu update security patch untuk

meningkatkan keamanan sistem operasi tersebut.

Page 11: Tugaas pemograman 3   1100631034

Kesimpulan

Saat ini begitu tinggi nilai informasi sehingga banyak pihak yang merasa

membutuhkan informasi yang belum tentu dan selayaknya dimiliki.

Dianalogikan dengan sistem keamanan pada protokol RPC, dimana

protokol ini awalnnya digunakan untuk mempermudah adanya

komunikasi antar klien server untuk aplikasi yang terdistribusi.

Perkembangan berikutnya menunjukkan bahwa fungsi asli protokol ini

digunakan pihak tidak bertanggung jawab untuk memperoleh informasi

yang bukan miliknya.

Simpulan terakhir adalah sesungguhnya tidak ada sistem yang seratus

persen aman dari kebocoran dan kelemahan.

Sebagai administrator sudah seharusnya untuk mengambil tindakan

preventif agar sistem yang dijaga tetap stabil dan terhindar dari

kelemahan yang bisa dimanfaatkan orang lain.

Dalam ilmu komputer, panggilan prosedur jauh (RPC) adalah proses antar-

komunikasi yang memungkinkan program komputer untuk menyebabkan

subroutine atau prosedur untuk mengeksekusi dalam ruang alamat lain (biasanya

pada komputer lain pada jaringan bersama) tanpa programmer secara eksplisit

coding rincian untuk interaksi terpencil ini. Artinya, programmer menulis pada

dasarnya kode yang sama apakah subrutin adalah lokal ke masing program, atau

remote. Ketika perangkat lunak tersebut menggunakan prinsip object-oriented,

RPC disebut remote doa atau pemanggilan metode remote.

Banyak teknologi yang berbeda (sering tidak sesuai) telah digunakan untuk

mengimplementasikan konsep tersebut.

Page 12: Tugaas pemograman 3   1100631034

Contoh source code dari RRPC sebagai berikut ini

Page 13: Tugaas pemograman 3   1100631034

1. Contoh 2

import org.apache.xmlrpc.*;

public class JavaServer {

public Integer sum(int x, int y) { return new Integer(x+y); }

public static void main (String [] args) { try {

System.out.println("Attempting to start XML-RPC Server..."); WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); System.out.println("Started successfully."); System.out.println("Accepting requests. (Halt program to stop.)"); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } }

2. Contoh 3

private Connection connection; private Channel channel; private String requestQueueName = "rpc_queue"; private String replyQueueName; private QueueingConsumer consumer;

public RPCClient() throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); connection = factory.newConnection(); channel = connection.createChannel();

Page 14: Tugaas pemograman 3   1100631034

replyQueueName = channel.queueDeclare().getQueue(); consumer = new QueueingConsumer(channel); channel.basicConsume(replyQueueName, true, consumer); }

public String call(String message) throws Exception { String response = null; String corrId = java.util.UUID.randomUUID().toString();

BasicProperties props = new BasicProperties .Builder() .correlationId(corrId) .replyTo(replyQueueName) .build();

channel.basicPublish("", requestQueueName, props, message.getBytes());

while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); if (delivery.getProperties().getCorrelationId().equals(corrId)) { response = new String(delivery.getBody()); break; } }

return response; }

public void close() throws Exception { connection.close(); }

3. Contoh 4

RPCClient fibonacciRpc = new RPCClient();

System.out.println(" [x] Requesting fib(30)"); String response = fibonacciRpc.call("30"); System.out.println(" [.] Got '" + response + "'");

fibonacciRpc.close();

Page 15: Tugaas pemograman 3   1100631034

1. SOAP (Simple Object Access Protocol)

SOAP ( Simple Object Access Protocol ) adalah cara untuk sebuah

program berjalan di satu jenis sistem operasi ( seperti Windows 2000 ) untuk

berkomunikasi dengan progam yang sama atau jenis lain dari sistem operasi ( seperti

Linux ) dengan menggunakan Dunia luas Web Hypertext transfer Protocol ( HTTP )

dan yang Extensible Markup Language ( XML ) sebagai mekanisme untuk pertukaran

informasi . Karena protokol Web yang terpasang dan tersedia untuk digunakan oleh

semua platform sistem operasi utama , HTTP dan XML memberikan solusi sudah di -

tangan untuk masalah bagaimana program berjalan di bawah sistem operasi yang

berbeda dalam jaringan dapat berkomunikasi satu sama lain . SOAP menentukan

persis bagaimana untuk mengkodekan header HTTP dan file XML sehingga program

dalam satu komputer dapat memanggil program di komputer lain dan

menyebarkannya informasi. Hal ini juga menentukan bagaimana disebut Program

dapat kembali tanggapan.SOAP dikembangkan oleh Microsoft , DevelopMentor , dan

Userland Software dan telah diusulkan sebagai standar interface ke Internet

Engineering Task Force ( IETF ) . Hal ini agak mirip dengan Internet Inter - ORB

Protocol ( IIOP ) , sebuah protokol yang merupakan bagian dari Obyek Umum

Permintaan Broker Architecture ( CORBA ) . Sun Microsystems 'Remote Method

Invocation ( RMI ) adalah klien / server yang sama Puskesmas meningkatkan protokol

antara program yang ditulis di Jawa .Sebuah keuntungan dari SOAP adalah bahwa

program panggilan jauh lebih mungkin untuk mendapatkan melalui server firewall

yang menyaring permintaan selain untuk aplikasi diketahui ( melalui mekanisme port

yang ditunjuk ) . Karena permintaan HTTP biasanya diperbolehkan melalui firewall ,

program menggunakan SOAP untuk berkomunikasi dapat yakin bahwa mereka dapat

berkomunikasi dengan program mana saja .

Page 16: Tugaas pemograman 3   1100631034

2. REST (REpresentational State Transfer)

REST sering digunakan dalam aplikasi mobile , situs jejaring sosial, alat

mashup dan proses bisnis otomatis . Gaya SISA menekankan bahwa interaksi antara

klien dan layanan ditingkatkan dengan memiliki sejumlah operasi ( verba ) .

Fleksibilitas disediakan sumber menugaskan ( nomina ) sendiri indikator sumber daya

universal yang unik mereka ( URI ) oleh . Karena setiap kata kerja memiliki arti

khusus ( GET , POST , PUT dan DELETE ) , SISA menghindari ambiguitas .

Seperti dijelaskan dalam disertasi oleh Roy Fielding , SISA adalah " gaya arsitektur "

yang pada dasarnya memanfaatkan teknologi yang ada dan protokol Web, termasuk

HTTP ( Hypertext Transfer Protocol ) dan XML . REST sederhana untuk digunakan

daripada SOAP terkenal ( Simple Object Access Protocol ) pendekatan , yang

mengharuskan menulis atau menggunakan server program yang disediakan ( untuk

melayani data) dan sebuah program klien ( untuk meminta data ) .

Contoh source code dari SOAP sebagai berikut :

Page 17: Tugaas pemograman 3   1100631034
Page 18: Tugaas pemograman 3   1100631034

REST (Representational State Transfer)

REST sering digunakan dalam aplikasi mobile , situs jejaring sosial,

alat mashup dan proses bisnis otomatis . Gaya SISA menekankan bahwa interaksi

antara klien dan layanan ditingkatkan dengan memiliki sejumlah operasi ( verba ) .

Fleksibilitas disediakan sumber menugaskan ( nomina ) sendiri indikator sumber daya

universal yang unik mereka ( URI ) oleh . Karena setiap kata kerja memiliki arti

khusus ( GET , POST , PUT dan DELETE ) , SISA menghindari ambiguitas .

Seperti dijelaskan dalam disertasi oleh Roy Fielding , SISA adalah " gaya arsitektur "

yang pada dasarnya memanfaatkan teknologi yang ada dan protokol Web, termasuk

HTTP ( Hypertext Transfer Protocol ) dan XML . REST sederhana untuk digunakan

daripada SOAP terkenal ( Simple Object Access Protocol ) pendekatan , yang

mengharuskan menulis atau menggunakan server program yang disediakan ( untuk

melayani data) dan sebuah program klien ( untuk meminta data ) .

REST adalah salah satu jenis web service yang menerapkan konsep perpindahan antar

state. State disini dapat digambarkan seperti jika browser meminta suatu halaman

web, maka serverakan mengirimkan state halaman web yang sekarang ke browser.

Bernavigasi melalui link-link yang disediakan sama halnya dengan mengganti state

dari halaman web. Begitu pula REST bekerja, dengan bernavigasi melalui link-link

HTTP untuk melakukan aktivitas tertentu, seakan-akan terjadi perpindahan state satu

sama lain. Perintah HTTP yang bisa digunakan adalah fungsi GET, POST, PUT atau

DELETE. Balasan yang dikirimkan adalah dalam bentuk XML sederhana tanpa ada

protokol pemaketan data, sehingga informasi yang diterima lebih mudah dibaca dan

diparsing disisi client.

Dalam pengaplikasiannya, REST lebih banyak digunakan untuk web

serviceyang berorientasi pada resource. Maksud orientasi pada resource adalah

orientasi yang menyediakan resource-resource sebagai layanannya dan bukan

kumpulan-kumpulan dari aktifitas yang mengolah resource itu.Alasan mengapa REST

tidak digunakan dalam skripsi ini karena orientasi pada resourcenya itu,sedangkan

aplikasi event calendar membutuhkan pemanggilan metode yang bisa dikerjakan

Page 19: Tugaas pemograman 3   1100631034

terhadap kumpulan resource event. Selain itu, karena standarnya yang kurang

sehingga tidak begitu cocok diterapkan dalam aplikasi yang membutuhkan kerjasama

antar aplikasi lain, dimana standar yang baik akan sangat berguna karena berbicara

dalam satu bahasa yang sama. Beberapa contoh web service yang menggunakan

REST adalah: Flickr API(Application ProgramInterface), YouTube API, Amazon API.

Solusi Mengakses REST

Pengembangan Aplikasi MVC dengan REST

Mengacu pada kasus pada bab sebelumnya, maka dengan ini akan diteruskan kasus pengembangan yaitu menggunakan Person sebagai kasus. Berikut ini adalah implementasi dari PersonController dan PersonService. Jujur saja, kode dalam subbab ini adalah modifikasi kecil dari code contoh REST dari Struts2, yang mana kode ini yang menjadi acuan migrasi dari Cimande 1.x ke 2.x, dari kemampuan MVC biasa menjadi RESTful MVC.

Yang menarik dari kasus kecil ini adalah untuk mempelajari mekanisme bagaimana pengembangan REST dilakukan, serta bagaimana merubah sebuah action dengan result jsp menjadi sebuah json, yang siap digunakan sebagai metadata pengembangan berbasis service atau peningkatan kemampuan interoperabilitas. Yang mana semua hal ini akan menjadi sajian utama buku ini.

Sebuah proyek kecil s2-rest-showcase, yang mengimplementasikan sebuah POJO Person, yang terdiri dari Nama dan Amount, dengan implementasi PersonController untuk memetakan hasil proses dengan lapisan presentasi (JSP) serta PersonService yang memiliki beberapa method seperti getAll(), save(), remove(), dan get(). REST showcase ini kalau ditilik lebih lanjut memiliki beberapa kelemahan, oleh karena itu kami memodifikasinya dengan membuat CimandeActionMapper dan membuat implementasi JSON dengan Jackson. Yang mana semaunya akan dibahas dibab ini.

Bab ini akan dijelaskan dimulai dari aplikasi REST berjenis produser, dilanjutkan dengan implementasi dari REST yang ditelah dikembangkan menggunakan aplikasi Java sederhana. Semua dengan kasus obyek Person. Implementasi diakhir bab adalah implementasi REST aplikasi sederhana ini dikembangkan menjadi sebuah sumber data atau data source alternatif selain Hibernate. Sebuah pendekatan perubahaan data source dari database menjadi services menggunakan mengutilisasi mekanisme injection.

Aplikasi produser layanan REST pertama adalah yang merupakan sebuah Array, dilanjutkan dengan implementasi Cimande dan Yama berbasis REST yang menggunakan Hibernate sebagai data source.

Page 20: Tugaas pemograman 3   1100631034

Fitur REST sebenarnya sudah tertuang dalam bab sebelumnya, maklum sejak REST plugins direlease, aplikasi web dengan Struts2 otomatis menjadi REST, dan kami mencoba membuat versi SpringMVC dengan kodename Yama, ternyata hasilnya sama juga. Dengan ini pembuktian bahwa pengembangan aplikasi REST adalah tidak mengembangkan sistem baru seperti halnya SOA, adalah benar apa adanya. Sehingga aset yang telah ada, dapat dimigrasi ke RESTfull tanpa perlu investasi tim pengembang baru. Menarik bukan!.

Struts2 telah memiliki fitur otomatis merubah setiap presentation view bilamana kita telah menambahkan template, tetap metadata baik JSON ataupun XML, tetap dihasilkan, hanya dengan menambahkan .json atau .xml dikhir URI. Untuk kasus Cimande dalam buku ini, karena menggunakan modifikasi dari JSON plugin dari json ke Jackson, maka extension akhir adalah .jackson, dengan output sama-sama JSON.

Kurang lebih output bilamana kita mengakses result yaitu dengan URL http://localhost:8080/cimande/person/result adalah sebagai berikut:

HTTP/1.1 200 OKDate: Mon, 28 Feb 2011 03:37:29 GMTContent-Length: 641Content-Type: application/jsonServer: Apache-Coyote/1.1

[{address:"",parent:{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:null},id:"402881f32e5b2e01012e5b32d42b0001",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:null,relation:null},{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:null},{address:"",parent:null,id:"402881f32e5d5a5d012e5d5af5420001",status:"single",firstName:"F",lastName:"F",gender:true,birthdate:1296493200000,relation:null}]

Untuk memulai pengembangan REST, mari kita menjalankan aplikasi Struts2 REST showcase yang disertakan dalam DVD buku ini.

Importlah kedalam Eclipse, dan jalankan. Akan langsung diredirect ke URL http://localhost:8080/S2ShowCase/persons. Sebuah hasil pencarian dihasilkan.

Page 21: Tugaas pemograman 3   1100631034

Harap memperhatikan source code yang ada disamping kiri, betul sekali. PersonController memilki banyak method, dan setiap method terhubung dengan file JSP yang berada di folder content dalam WebContent.

Setting method didalam PersonController adalah tanpa setting apapun, sehingga bilamana kita membuat satu method, misalnya makan, maka otomatis dibutuhkan persons-makan.jsp, sebagai template presentation layernya.

Contoh REST Show case adalah menggunakan Person, metode yang mirip yang dijelaskan dibab sebelumnya, tetapi showcase ini sangat baik untuk menjadi ajang pembelajaran, karena hanya menggunakan template dan action, tidak ada persistance, injection atau sejenisnya. Ini adalah sebuah contoh aplikasi web dengan MVC yang sederhana.

Untuk memudahkan memahami showcase dapat melihat diagram dibawah ini:

Page 22: Tugaas pemograman 3   1100631034

Diagram menjelaskan ada Controller, Service dan POJO.

Adapun hubungan antara PersonController, PersonService dan Person adalah sama dengan kasus bab sebelumnya. Berikut adalah desain UMLnya.

Page 23: Tugaas pemograman 3   1100631034

UML Person Showcase

Bandingkan dengan mekanisme bab sebelumnya, lebih mudah dan praktis bukan. Bilamana kita hendak mempoint method ke template yang kita tentukan, seperti konsep yang dijelaskan pada bab berikutnya. Tunggulah jawabannya, akan dijelaskan setelah ini.

Implementasi REST

Bab sebelumnya menjelaskan bagaimana sebuah controller, injection dan mengembangkan aplikasi MVC diatas sebuah integration framework. Pengembangan aplikasi MVC akan semakin mudah, bilamana integration frameworknya sangat terpadu dan modular. Contoh pengembangan aplikasi CRUD dengan kasus table pegawai telah dijelaskan. Proses berikutnya adalah mengembangkannya menjadi REST.

Bab ini diharapkan ada peningkatan pengembangan yaitu mengimplementasikan pattern DAO dan juga implementasi Service. Sebuah mekanisme yang memisahkan hubungan ke model dan membuat sebuah controller bersifat pelayanan.

Untuk memulainya hanya memerlukan mengimport code Cimande2 ke Eclipse WTP, dan menjalankannya dengan Tomcat (code jalan di Tomcat versi 6 maupun 7). Tetapi code dalam buku ini menggunakan Tomcat 7.

Bilamana telah berjalan sebuah form new dengan URI /person/new akan dijalankan oleh Eclipse, dan sebuah form isian kosong akan terbentuk.

Page 24: Tugaas pemograman 3   1100631034

Harap diperhatikan, saat menjalanknyannya setuplah database dengan benar. Setting database dapat dengan membuka hibernate.cfg.xml.

Cobalah melakukan pengisian beberapa kali, dan jalankan URL berikut http://localhost:8080/Cimande2/person. Sebuah search result akan terbentuk.

Yang ajaib dari proyek Cimande2 ini adalah, kita tidak perlu membuat database, table atau fieldnya, hanya dengan merubah setting hibernate.cfg.xml, dan secara otomatis

Page 25: Tugaas pemograman 3   1100631034

saat dijalankan table dibuat. Lebih hebat lagi bilamana, kita merubah entity yang ada, dan secara otomatis skema table dirubah mengacu pada table yang baru. Upgrade otomatis, hebat sekali bukan.

Coba click “Edit” dan akan muncul sebuah form edit dengan URI /person/{id}, id yang dimaksud adalah id dari field, silahkan masuk ke database, dan buka table nya dan cari idnya.

Harap diperhatikan, id tidak auto increment, dan digenerate oleh sistem, dalam kasus ini oleh Hibrnate, informasi lebih lanjut mengenai generate id dapat melihat DefaultPersistance.

Yang menarik dari kode yang disertakan dibab sebelumnya dengan bab ini adalah implementasi Controller. Berikut adalah PersonController, dan setiap method yang dibuat mewakili satu action. Harap memperhatikan annonation yang ada, yaitu @Result, terdapat beberapa mekanisme implementasi yaitu velocity dan redirect, yang artinya action yang dijalankan menggunakan template engine velocity dan yang tidak ada presentasi result melakukan redirect ke action lainnya..

Menampilkan metadata JSON atau XML

Cimande

Page 26: Tugaas pemograman 3   1100631034

Yama

Mengkonsumsi layanan berbasis REST

Subbab ini akan mendalami bagaimana mengkonsumsi layanan yang dihasilkan dari aplikasi yang telah dikembangkan. Untuk mengimplementasikannya, tetap digunakan pendekatan CRUD, sehingga mekanismenya dapat digunakan menjadi aplikasi lain. Metode yang akan diterangkan akan terus berkelanjutan, dibab berikutnya akan digunakan dalam implementasi dalam lingkungan Android, sedangkan diakhir bab akan digunakan untuk menciptakan composite dashboard dengan Liferay. Impelementasi yang tidak dijelaskan dalam bab ini adalah mengkonsumsinya menggunakan Javascript, baik itu menggunakan ExtJS ataupun JQuery.

Secara konsep, mengkonsumsi REST adalah mirip dengan mekanisme menggunakan database sebagai sumber data, hanya jenisnya saja yang berubah dari database menjadi metadata baik itu XML atau JSON.

JSON digunakan karena implementasinya dapat langsung didalam browser, dan dikarenakan harus melakukan konversi XML ke JSON (Array Javascript), dan prosesnya membutuhkan resource, sehingga JSON diproses diserver. Implementasi ini malah menjadi kebablasan, sehingga aplikasi yang non browser juga ikut-ikutan mengimplementasikannya. Dan salah satu implementasinya yang kebablasan ini adalah buku ini, dimulai dari bab ini.

Implementasi dari aplikasi yang telah kita kembangkan, bilamana telah menjadi RESTful, adalah terdiri dari dua tipe, yaitu layanan yang public tanpa keamanan, dan layanan yang membutuhkan keamanan.

Layanan yang public yang umum adalah RSS dari blog, sedangkan layanan yang membutuhkan keamanan, digunakan umumnya untuk melindungi data, atau pemisahan konten sesuai dengan jenjang. Impelementasi data yang dengan keamanan yang sangat mudah dipahami adalah Flickr dengan Web APInya atau implementasi aplikasi Facebook.

Page 27: Tugaas pemograman 3   1100631034

Izin Mengakses REST pada Facebook yang menggunakan kunci keamanan

Mengkonsumsi REST publik

Dalam implementasi konsumsi layanan REST publik, sebenarnya kita hanya membutuhkan URI dari HTTP, dan kemudian hanya perlu mengimplementasikannya, mau GET atau POST. POST sebaiknya digabungkan dengan security lainnya, bilamana tidak, dijamin spammer akan menyerang secara dahsyat.

Sub area bab ini dijelaskan mengenai pengembangan aplikasi yang mengkonsumsi layanan REST berjenis JSON, adalah untuk pemahaman semata. Sebaiknya keamanan diimplementasikan. Wong dengan keamanan berlapis saja, bisa dijebol.

Diagram dibawah ini menjelaskan bagaimana melakukan pengkonsumsian dengan URI http://localhost:8080/person, dimana dalam implementasinya adalah http://localhost:8080/cimande/person, bilamana menggunakan Cimande, dan http://localhost:8080/yama/person, bilamana menggunakan Yama.

Page 28: Tugaas pemograman 3   1100631034

Mekanisme pengkonsumsian layanan REST

Berikut adalah sumber kode dari HTTPGetPerson, yang mengkonsumsi layanan REST, tetapi data yang dikembalikan hanya 1 data, data tersebut akan dikonversi menjadi obyek Person. Lebih jelasnya silahkan buka file HTTPGetPerson

package org.blueoxygen.cimande.httpclient;

public class HTTPGetPerson {public static void main(String[] args) {

String scheme = "http";String host = "localhost";int port = 8080;String contextPath = "Cimande";ObjectMapper mapper = new ObjectMapper();

try {HttpClient client = new DefaultHttpClient();HttpResponse response = null;String sampleId = "ff8081812e7afe23012e7affa8310003";URI uri = URIUtils.createURI(scheme, host, 8080, contextPath

+ "/person/" + sampleId + "/edit.jackson", null, null);

HttpUriRequest request = new HttpGet(uri);response = client.execute(request);

// return json from URL become String theJSONString theJSON = EntityUtils.toString(response.getEntity());

System.out.println("Return : " + theJSON);Person person = mapper.readValue(theJSON, Person.class);

System.out.println("First Name : " + person.getFirstName());System.out.println("Last Name : " + person.getLastName());System.out.println("Parent : "

+ (person.getParent() == null ? "" : person.getParent()

Page 29: Tugaas pemograman 3   1100631034

.getFirstName()+ " "+

person.getParent().getLastName()));} catch (Exception e) {

e.printStackTrace();}

}}

Yang patut diperhatikan dari kode diatas adalah URI, sampleId, dan mapper.readValue(). Dimana URI adalah sumber datanya, sedangkan sampleId adalah ID atau primary key dari data yang hendak kita tampilkan, sedangkan mapper.readValue() digunakan untuk mengkonversi JSON yang didapat dari server menjadi Person.class.

Berikut ini adalah bilamana hendak melakukan pengambilan data, tetapi data yang dikembalikan lebih dari satu data, dan bilamana dikonversi menjadi sebuah koleksi data, yang terdiri dari banyak obyek Person.

Kata kunci dari merubah JSON yang lebih dari satu data, menjadi sebuah koleksi adalah sebagai berikut:

public List<Person> getPersonsJackson(String json)throws JsonParseException, JsonMappingException,

IOException {

TypeReference<ArrayList<Person>> typeReference = new TypeReference<ArrayList<Person>>() {

};

List<Person> persons = mapper.readValue(json, typeReference);

return persons;}

TypeReference ini akan merubah JSON yang masuk menjadi ArrayList, yang mana persons yang direturn adalah List.

Metod getPersonsJackson() dikombinasikan dengan hasil dari HTTPreqeust, menjadi List dengan value berjenis obyek Person.

Berikut adalah implementasi dari metho getPersonsJackson() menjadi JSON.

HTTPGetPersons person = new HTTPGetPersons();HttpClient client = new DefaultHttpClient();

Page 30: Tugaas pemograman 3   1100631034

HttpResponse response = null;

URI uri = URIUtils.createURI(scheme, host, 8080, contextPath+ "/person/result.jackson", null, null);

HttpUriRequest request = new HttpGet(uri);response = client.execute(request);

// return json from URL become String theJSONString theJSON = EntityUtils.toString(response.getEntity());System.out.println("POST " + uri);System.out.println("Return : " + theJSON);System.out.println();

String status = "";for (Header header : response.getAllHeaders()) {

status = status + header.getValue() + "\n";}

System.out.println("------ Convert via Jackson ------");for (Person p : person.getPersonsJackson(theJSON)) {

Adapun kode lengkap dari mengambil data menggunakan HttpGet adalah sebagai berikut:

package org.blueoxygen.cimande.httpclient;

public class HTTPGetPersons {

private ObjectMapper mapper = new ObjectMapper();private Gson gson = new Gson();

public List<Person> getPersonsJackson(String json)throws JsonParseException, JsonMappingException,

IOException {

TypeReference<ArrayList<Person>> typeReference = new TypeReference<ArrayList<Person>>() {

};

List<Person> persons = mapper.readValue(json, typeReference);

return persons;}

Page 31: Tugaas pemograman 3   1100631034

public List<Person> getPersonsGson(String json) {

Type listType = new TypeToken<ArrayList<Person>>() {}.getType();

List<Person> persons = gson.fromJson(json, listType);

return persons;}

public String getSecret(String json) throws JsonParseException,JsonMappingException, IOException {

return mapper.readValue(json, HashMap.class).get("secret") + "";}

// this class will consume Person rest URL and return Persons, and interate// Person..public static void main(String[] args) {

String scheme = "http";String host = "localhost";int port = 8080;String contextPath = "Cimande";

try {HTTPGetPersons person = new HTTPGetPersons();HttpClient client = new DefaultHttpClient();HttpResponse response = null;

URI uri = URIUtils.createURI(scheme, host, 8080, contextPath+ "/person/result.jackson", null, null);

HttpUriRequest request = new HttpGet(uri);response = client.execute(request);

// return json from URL become String theJSONString theJSON = EntityUtils.toString(response.getEntity());System.out.println("POST " + uri);System.out.println("Return : " + theJSON);System.out.println();

String status = "";for (Header header : response.getAllHeaders()) {

status = status + header.getValue() + "\n";}

Page 32: Tugaas pemograman 3   1100631034

System.out.println("------ Convert via Jackson ------");for (Person p : person.getPersonsJackson(theJSON)) {

System.out.println("First Name : " + p.getFirstName());System.out.println("Last Name : " + p.getLastName());System.out.println("------------------------------");

}

System.out.println();

System.out.println("------ Convert via Gson ------");for (Person p : person.getPersonsGson(theJSON)) {

System.out.println("First Name : " + p.getFirstName());System.out.println("Last Name : " + p.getLastName());System.out.println("------------------------------");

}

} catch (Exception e) {e.printStackTrace();

}

}

}

Bagaimana bilamana hendak mengirim data? Tentu saja implementasi POST yang harus kita gunakan, adapun implementasinya dipecah menjadi 2 area, yaitu implementasi koleksi untuk masukan atau parameter, dan pengiriman parameter untuk ekskusi.

Berikut adalah implementasi koleksi masukan atau paramternya;

// Set request parameterList<NameValuePair> formparams = new

ArrayList<NameValuePair>();formparams.add(new BasicNameValuePair("username", "dianw"));formparams.add(new BasicNameValuePair("password", "dianw"));formparams.add(new BasicNameValuePair("firstName", "Dian"));formparams.add(new BasicNameValuePair("lastName", "Aditya"));formparams.add(new BasicNameValuePair("gender", "true"));

Sedangkan implementasi melakukan pengiriman informasi adalah sebagai berikut:

HttpPost httpPost = new HttpPost(uri);//httpPost.setHeader("Content-type", "text/html");

Page 33: Tugaas pemograman 3   1100631034

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams);httpPost.setEntity(entity);System.out.println(uri);

HttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(httpPost);

Mengimplementasikan Keamanan dalam pengiriman data REST.

Mekanisme yang telah dijelaskan adalah mengkonsumsi data yang dihasilkan REST server tanpa keamanan, termasuk juga mengirim atau memasukan data ke dalam REST server. Mekanisme itu adalah sangat tidak aman dan sangat mudah diserang spammer, khususnya yang POST.

Untuk mengimplementasikan security, diperlukan seperti layanan tambahan untuk memproses dan mengola data yang berjenis keamanan, yang notabene umumnya berhubungan dengan user, password atau sejenisnya.

Berikut adalah UML dari implementasi token interceptor yang bertugas mengfilter setiap request REST.

Diagram UML Implementasi Keamanan dengan Token

Page 34: Tugaas pemograman 3   1100631034

Implementasi token keamanan didalam lingkungan REST adalah sangat penting, sebab jenis transaksi REST adalah state less, yang berarti setiap request dengan request lainnya tidak saling berhubungan. Berbeda dengan implementasi pada browser, yang ditahan adalah sessionnya, yang akan jatuh tempo setelah 20 menit umumnya, dimana saat itu diperlukan login kembali.

Lingkungan REST yang statefull memerlukan identifikasi sendiri untuk membuat setiap request memiliki keterkaitan.

Implementasi UML diatas adalah sama dan mirip dengan implementasi Person, yang telah dibahas dibab sebelumnya, dimana ditemukan Controller, Service dan Model. Yang membedakan adalah implementasinya tidak menjadi View baik itu HTML atau JSON ataupun XML, melainkan digabungkan kedalam interceptor. Kalau diperhatikan didalam kode sumber Cimande, ada 2 implementasi interceptor, untuk memproses .jackson yang merupakan plugin Strut2 dan implementasi token ini.

Banyaknya interceptor adalah tidak dibatasi, dan tentu saja berhubungan langsung dengan performansi server, karena setiap interceptor membutuhkan resource.

Telah dikembangkan GetToken, sebuah aplikasi sederhana untuk merubah username dan password, menjadi token yang diambil dari table User (variable secret yang berjenis String).

Mekanisme pemrosesan username/password menjadi token

URI dari token adalah /login, artinya implementasi dari UserController. Berikut adalah annonation dari UserController yang melakukan mapping terhadap /login adalah @Actions( { @Action("/user/login"), @Action("/user/register") }).

Implementasi pembuatan secret key atau token keamanan ini, masih sangat sederhana, hanya mengimplementasikan UUID.randomUUID().

user.setSecret(UUID.randomUUID().toString());

Sedangkan untuk menggunakannya adalah dengan implementasi seperti ini

URI uri = URIUtils.createURI(scheme, host, port, contextPath+ "/person/" + sampleId + "/edit.jackson", "key=" + secret, null);

Page 35: Tugaas pemograman 3   1100631034

Dimana key yang dimasukan akan diproses bukan oleh PersonController, tetapi oleh ServiceInterceptor.

if (request.getParameter("key") != null) {User user = service.getBySecret(request.getParameter("key"));

if (user != null) {return invocation.invoke();

}}

Key ini adalah pintu untuk memperbolehkan mengambil data Person, dan PersonController akan diproses.

Berikut adalah diagram untuk menjelaskan proses pengambilan obyek Person yang lebih dari satu.

Implementasi mengambil data dari server REST dengan mekanisme token

Berikut adalah implementasi dari kode yang telah dijelaskan diawal bab ini tetapi menggunakan token, untuk lebih lengkapnya silahkan melihat kode sumber bab ini.

GetPersonWithToken:

HttpClient client = new DefaultHttpClient();HttpResponse response = null;

String theJSON = "";

// Get secret keyString secret = GetToken.getSecret("dian", "dian");

String sampleId = "ff8081812e7afe23012e7affa8310003";

URI uri = URIUtils.createURI(scheme, host, port, contextPath+ "/person/" + sampleId + "/edit.jackson", "key=" + secret,

null);

Page 36: Tugaas pemograman 3   1100631034

HttpUriRequest request = new HttpGet(uri);response = client.execute(request);

GetPersonsWithToken:

HTTPGetPersonsWithToken person = new HTTPGetPersonsWithToken();HttpClient client = new DefaultHttpClient();HttpResponse response = null;

// Get secret keyString secret = GetToken.getSecret("dian", "dian");

URI uri = URIUtils.createURI(scheme, host, 8080, contextPath+ "/person/result.jackson", "key=" + secret, null);

HttpUriRequest request = new HttpGet(uri);response = client.execute(request);

// return json from URL become String theJSONString theJSON = EntityUtils.toString(response.getEntity());

Bekerja dengan JSONFactory

Telah dijelaskan pada sub bab diatas, mengenai bagaimana mengkonsumsi sebuah layanan berbasis REST dengan output JSON, baik layanan publik tanpa hak akses ataupun dengan mekanisme token untuk hak akses. Sub bab ini akan membahas mengenai implementasi menggunakan mekanisme factory, sebuah implementasi yang umum digunakan pada solusi berbasis container seperti Java.

Kelebihan mekanisme factory adalah thread yang dikelola didalam factory, sering disebut ObjectFactory. Mekanisme ini adalah dikarenakan mengakses sebuah sumber data sangat memerlukan resource, dan sebaiknya dilakukan implementasi pooling, hal yang sama yang kita temukan pada saat kita mengakses database dengan connection pooling.

Tentu saja dengan mengetahui fitur factory didalam sebuah API, maka kita dapat mulai menggunakan konsep yang sama untuk semua data source yang kita akan gunakan. Jadi tidak asal pakai saja.

Untuk sub bab ini kita hanya membahas JSON API dari Jackson (http://jackson.codehaus.org), tetapi disubbab sebelumnya ada GSON dari Google, tetapi karena tidak ada fitur JSONFactory, maka kita mengimplementasikan Jackson.

Page 37: Tugaas pemograman 3   1100631034

JSONFactory dari Jackson ada di org.codehaus.jackson.JsonFactory. Sedangkan implementasi untuk session factorynya (istilah yang digunakan di Hibernate), adalah org.codehaus.jackson.JsonGenerator.

Didalam Jackson, terdapat JsonFactory adalah pabrik dari json di Jackson, sedangkan JsonGenerator untuk menulis Json, JsonParser untuk membaca. Ada satu obyek yaitu ObjectMapper yang digunakan untuk membinding Json. Sebuah gabungan dari JsonParser dan JsonGenerator? Nah ObjectMapper ini dapat dikatakan XML Bindingnya JSON. ObjectMapper ini akan menggunakan JsonParser dan JsonGenerator dalam membentuk instan JSON.

Mekanisme factory yang telah dijelaskan dan beberapa obyek yang hendak kita gunakan, akan kita implementasikan didalam ApplicationContext Spring, yang tertulis seperti ini.

<bean id="jacksonObjectmapper" class="org.codehaus.jackson.map.ObjectMapper" />

<bean id="jacksonJsonFactory" class="org.codehaus.jackson.JsonFactory"><constructor-arg index="0" ref="jacksonObjectmapper" />

</bean><bean

class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"><property name="objectMapper" ref="jacksonObjectmapper" />

</bean>

Konfigurasi <bean> dapat dilihat di file ApplicationContext.xml didalam folder /src/resource. Yang mana dalam implementasinya akan dideploy di /WEB-INF/classes.

Mengimplementasikan JsonFactory adalah dengan menambahkan @Autowired di class Service, dalam kasus buku ini adalah PersonServiceImpl, sebuah implementasi dari PersonService.

Berikut adalah settingnya

@Autowiredprivate JsonFactory jsonFactory;

Implementasi dari JsonFactory adalah dengan membuat view dari /person/{id}, sama dengan edit yang telah diimplementasikan dibab MVC. Tentu saja model yang dibahas disini adalah mengkonsumsi JSON.

Untuk menghasilkan JSON, berikut adalah contoh memproses JSON menjadi JSON di PersonJsonController, sebuah implementasi REST dengan JsonFactory.

Page 38: Tugaas pemograman 3   1100631034

public String jsonGet() {try {

HttpServletResponse response = ServletActionContext.getResponse();

response.setContentType("application/json");response.setCharacterEncoding("UTF-8");

personService.writePersonAsJson(person.getId(),response.getWriter());

} catch (IOException e) {e.printStackTrace();

}

return SUCCESS;}

Adapun diagram kerja dituangkan dalam diagram berikut

Implementasi JsonFactory ini bersamaan dengan HibernateFactory, sehingga dapat dikatakan kode dari sub bab ini adalah implementasi MVC dengan output JSON, dengan data source dari database dan JSON.