SlideShare a Scribd company logo
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
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
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
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
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.
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
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
• 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 :
• 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
• 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.
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 antarkomunikasi 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.
Contoh source code dari RRPC sebagai berikut ini
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();
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();
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 .
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 :
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
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.
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 OK
Date: Mon, 28 Feb 2011 03:37:29 GMT
Content-Length: 641
Content-Type: application/json
Server: Apache-Coyote/1.1
[{address:"",parent:
{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firs
tName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:nu
ll},id:"402881f32e5b2e01012e5b32d42b0001",status:"single",firstName:"Frans",last
Name:"Thamura",gender:true,birthdate:null,relation:null},
{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firs
tName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:nu
ll},
{address:"",parent:null,id:"402881f32e5d5a5d012e5d5af5420001",status:"single",first
Name:"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.
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:
Diagram menjelaskan ada Controller, Service dan POJO.
Adapun hubungan antara PersonController, PersonService dan Person adalah sama
dengan kasus bab sebelumnya. Berikut adalah desain UMLnya.
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.
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
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
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.
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.
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 theJSON
String 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()
.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();
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 theJSON
String 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;
}
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 theJSON
String 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)) {
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 parameter
List<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");
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
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);
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 key
String secret = GetToken.getSecret("dian", "dian");
String sampleId = "ff8081812e7afe23012e7affa8310003";
URI uri = URIUtils.createURI(scheme, host, port, contextPath
+ "/person/" + sampleId + "/edit.jackson", "key=" + secret,
null);
HttpUriRequest request = new HttpGet(uri);
response = client.execute(request);
GetPersonsWithToken:
HTTPGetPersonsWithToken person = new HTTPGetPersonsWithToken();
HttpClient client = new DefaultHttpClient();
HttpResponse response = null;
// Get secret key
String 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 theJSON
String 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.
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 /WEBINF/classes.
Mengimplementasikan JsonFactory adalah dengan menambahkan @Autowired di
class Service, dalam kasus buku ini adalah PersonServiceImpl, sebuah implementasi
dari PersonService.
Berikut adalah settingnya
@Autowired
private 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.
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.

More Related Content

What's hot

Trivial file transfer protocol (tftp)
Trivial file transfer protocol (tftp)Trivial file transfer protocol (tftp)
Trivial file transfer protocol (tftp)
Yunan MaOng
 
Port tcp dan udp
Port tcp dan udpPort tcp dan udp
Port tcp dan udp
fiqhan
 
Jaringan komputer 10
Jaringan komputer 10Jaringan komputer 10
Jaringan komputer 10
Mr Nahot Frastian
 
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBINGLAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
uswarendy
 
Tabel port protokol jaringan tcp
Tabel port protokol jaringan tcpTabel port protokol jaringan tcp
Tabel port protokol jaringan tcp
Thesyech Daroy
 
Modul 3 Firewall (iptables)
Modul 3 Firewall (iptables)Modul 3 Firewall (iptables)
Modul 3 Firewall (iptables)
Sugeng Rizky Darmawanto
 
Laporan keamanan data 1
Laporan keamanan data 1Laporan keamanan data 1
Laporan keamanan data 1ramasatriaf
 
Transport Layer
Transport LayerTransport Layer
Transport Layer
Robby Firmansyah
 
Transpot layer
Transpot layerTranspot layer
Transpot layer
Aji Retnawan
 
Transport layer
Transport layerTransport layer
Transport layer
peces123
 
Laporan Pendahuluan Kamdat
Laporan Pendahuluan KamdatLaporan Pendahuluan Kamdat
Laporan Pendahuluan Kamdat
iintanamalia
 
Pengamatan Wireshark pada TCP dan UDP
Pengamatan Wireshark pada TCP dan UDPPengamatan Wireshark pada TCP dan UDP
Pengamatan Wireshark pada TCP dan UDP
ramasatriaf
 
FTP
FTP FTP
10 transport layer (tcp&udp)
10 transport layer (tcp&udp)10 transport layer (tcp&udp)
10 transport layer (tcp&udp)Dede Yudhistira
 
Tugas 1 analisis paket network protocol dengan menggunakan tools wireshark
Tugas 1 analisis paket network protocol dengan menggunakan tools wiresharkTugas 1 analisis paket network protocol dengan menggunakan tools wireshark
Tugas 1 analisis paket network protocol dengan menggunakan tools wireshark
Eka Putuasduki
 

What's hot (16)

Trivial file transfer protocol (tftp)
Trivial file transfer protocol (tftp)Trivial file transfer protocol (tftp)
Trivial file transfer protocol (tftp)
 
Port tcp dan udp
Port tcp dan udpPort tcp dan udp
Port tcp dan udp
 
Jaringan komputer 10
Jaringan komputer 10Jaringan komputer 10
Jaringan komputer 10
 
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBINGLAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
LAPORAN PENDAHULUAN NETWORK SCANNER & NETWORK PROBING
 
Tabel port protokol jaringan tcp
Tabel port protokol jaringan tcpTabel port protokol jaringan tcp
Tabel port protokol jaringan tcp
 
Modul 3 Firewall (iptables)
Modul 3 Firewall (iptables)Modul 3 Firewall (iptables)
Modul 3 Firewall (iptables)
 
Laporan keamanan data 1
Laporan keamanan data 1Laporan keamanan data 1
Laporan keamanan data 1
 
Transport Layer
Transport LayerTransport Layer
Transport Layer
 
Modul 2
Modul 2Modul 2
Modul 2
 
Transpot layer
Transpot layerTranspot layer
Transpot layer
 
Transport layer
Transport layerTransport layer
Transport layer
 
Laporan Pendahuluan Kamdat
Laporan Pendahuluan KamdatLaporan Pendahuluan Kamdat
Laporan Pendahuluan Kamdat
 
Pengamatan Wireshark pada TCP dan UDP
Pengamatan Wireshark pada TCP dan UDPPengamatan Wireshark pada TCP dan UDP
Pengamatan Wireshark pada TCP dan UDP
 
FTP
FTP FTP
FTP
 
10 transport layer (tcp&udp)
10 transport layer (tcp&udp)10 transport layer (tcp&udp)
10 transport layer (tcp&udp)
 
Tugas 1 analisis paket network protocol dengan menggunakan tools wireshark
Tugas 1 analisis paket network protocol dengan menggunakan tools wiresharkTugas 1 analisis paket network protocol dengan menggunakan tools wireshark
Tugas 1 analisis paket network protocol dengan menggunakan tools wireshark
 

Similar to Tugaas pemograman 3 1100631034

Tugas_pemrograman3_1100631026_Helmi_MH_
Tugas_pemrograman3_1100631026_Helmi_MH_Tugas_pemrograman3_1100631026_Helmi_MH_
Tugas_pemrograman3_1100631026_Helmi_MH_
Helmi Mahfudhatul
 
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugoTugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
Arif Prayugo
 
Tugas 1100631004 pemrog3
Tugas 1100631004 pemrog3Tugas 1100631004 pemrog3
Tugas 1100631004 pemrog3
Ricky Anas Prayogo
 
Sister 04 - remote procedure call (rpc)
Sister   04 - remote procedure call (rpc)Sister   04 - remote procedure call (rpc)
Sister 04 - remote procedure call (rpc)
Febriyani Syafri
 
KOMUNIKASI DATA
KOMUNIKASI DATAKOMUNIKASI DATA
KOMUNIKASI DATA
Pramudya Maulana
 
Jarkom - Jilid VII
Jarkom - Jilid VIIJarkom - Jilid VII
Jarkom - Jilid VII
rezarmuslim
 
Materi protokol jaringan
Materi protokol jaringanMateri protokol jaringan
Materi protokol jaringan
krisdjayanti1
 
Esai rpc, soap, dan rest
Esai rpc, soap, dan restEsai rpc, soap, dan rest
Esai rpc, soap, dan restUlil Uliland
 
Modul Network Troubleshooting 2
Modul Network Troubleshooting 2Modul Network Troubleshooting 2
Modul Network Troubleshooting 2sinta chen
 
Ready
ReadyReady
Ready
Agus Cahyo
 
OSI Layer pada Wireshark
OSI Layer pada WiresharkOSI Layer pada Wireshark
OSI Layer pada Wireshark
Hanif Yogatama
 
Modul network troubleshooting
Modul network troubleshootingModul network troubleshooting
Modul network troubleshooting
suparma
 
9-keamanan-jaringan1.ppt
9-keamanan-jaringan1.ppt9-keamanan-jaringan1.ppt
9-keamanan-jaringan1.ppt
TraFordy1
 
Modul network troubleshooting
Modul network troubleshootingModul network troubleshooting
Modul network troubleshooting
PAMBAH.Corp
 
Osi layers
Osi layersOsi layers
Bab3 protocol secured
Bab3 protocol securedBab3 protocol secured
Bab3 protocol secured
indra47
 
Application Layer
Application LayerApplication Layer
Application Layerrosmida
 
Tugas pemr3 1100631014 rpc,soap,rest
Tugas pemr3 1100631014 rpc,soap,restTugas pemr3 1100631014 rpc,soap,rest
Tugas pemr3 1100631014 rpc,soap,rest
Kienda Dwi Ajie
 

Similar to Tugaas pemograman 3 1100631034 (20)

Tugas_pemrograman3_1100631026_Helmi_MH_
Tugas_pemrograman3_1100631026_Helmi_MH_Tugas_pemrograman3_1100631026_Helmi_MH_
Tugas_pemrograman3_1100631026_Helmi_MH_
 
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugoTugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
Tugas pemrograman 3 (rpc,soap,rest) 1100631003 muhammad arif prayugo
 
Tugas 1100631004 pemrog3
Tugas 1100631004 pemrog3Tugas 1100631004 pemrog3
Tugas 1100631004 pemrog3
 
Sister 04 - remote procedure call (rpc)
Sister   04 - remote procedure call (rpc)Sister   04 - remote procedure call (rpc)
Sister 04 - remote procedure call (rpc)
 
KOMUNIKASI DATA
KOMUNIKASI DATAKOMUNIKASI DATA
KOMUNIKASI DATA
 
RCP, SOAP, REST
RCP, SOAP, RESTRCP, SOAP, REST
RCP, SOAP, REST
 
Rpc, soap,rest
Rpc, soap,restRpc, soap,rest
Rpc, soap,rest
 
Jarkom - Jilid VII
Jarkom - Jilid VIIJarkom - Jilid VII
Jarkom - Jilid VII
 
Materi protokol jaringan
Materi protokol jaringanMateri protokol jaringan
Materi protokol jaringan
 
Esai rpc, soap, dan rest
Esai rpc, soap, dan restEsai rpc, soap, dan rest
Esai rpc, soap, dan rest
 
Modul Network Troubleshooting 2
Modul Network Troubleshooting 2Modul Network Troubleshooting 2
Modul Network Troubleshooting 2
 
Ready
ReadyReady
Ready
 
OSI Layer pada Wireshark
OSI Layer pada WiresharkOSI Layer pada Wireshark
OSI Layer pada Wireshark
 
Modul network troubleshooting
Modul network troubleshootingModul network troubleshooting
Modul network troubleshooting
 
9-keamanan-jaringan1.ppt
9-keamanan-jaringan1.ppt9-keamanan-jaringan1.ppt
9-keamanan-jaringan1.ppt
 
Modul network troubleshooting
Modul network troubleshootingModul network troubleshooting
Modul network troubleshooting
 
Osi layers
Osi layersOsi layers
Osi layers
 
Bab3 protocol secured
Bab3 protocol securedBab3 protocol secured
Bab3 protocol secured
 
Application Layer
Application LayerApplication Layer
Application Layer
 
Tugas pemr3 1100631014 rpc,soap,rest
Tugas pemr3 1100631014 rpc,soap,restTugas pemr3 1100631014 rpc,soap,rest
Tugas pemr3 1100631014 rpc,soap,rest
 

Tugaas pemograman 3 1100631034

  • 1. 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
  • 2. 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
  • 3. 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
  • 4. 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
  • 5. 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.
  • 6. 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
  • 7. 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
  • 8. • 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 :
  • 9. • 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
  • 10. • 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.
  • 11. 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 antarkomunikasi 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.
  • 12. Contoh source code dari RRPC sebagai berikut ini
  • 13. 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();
  • 14. 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();
  • 15. 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 .
  • 16. 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 :
  • 17.
  • 18. 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
  • 19. 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.
  • 20. 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 OK Date: Mon, 28 Feb 2011 03:37:29 GMT Content-Length: 641 Content-Type: application/json Server: Apache-Coyote/1.1 [{address:"",parent: {address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firs tName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:nu ll},id:"402881f32e5b2e01012e5b32d42b0001",status:"single",firstName:"Frans",last Name:"Thamura",gender:true,birthdate:null,relation:null}, {address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firs tName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:nu ll}, {address:"",parent:null,id:"402881f32e5d5a5d012e5d5af5420001",status:"single",first Name:"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.
  • 21. 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:
  • 22. Diagram menjelaskan ada Controller, Service dan POJO. Adapun hubungan antara PersonController, PersonService dan Person adalah sama dengan kasus bab sebelumnya. Berikut adalah desain UMLnya.
  • 23. 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.
  • 24. 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
  • 25. 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
  • 26. 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.
  • 27. 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.
  • 28. 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 theJSON String 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()
  • 29. .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();
  • 30. 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 theJSON String 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; }
  • 31. 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 theJSON String 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"; }
  • 32. 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 parameter List<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");
  • 33. 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
  • 34. 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);
  • 35. 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 key String secret = GetToken.getSecret("dian", "dian"); String sampleId = "ff8081812e7afe23012e7affa8310003"; URI uri = URIUtils.createURI(scheme, host, port, contextPath + "/person/" + sampleId + "/edit.jackson", "key=" + secret, null);
  • 36. HttpUriRequest request = new HttpGet(uri); response = client.execute(request); GetPersonsWithToken: HTTPGetPersonsWithToken person = new HTTPGetPersonsWithToken(); HttpClient client = new DefaultHttpClient(); HttpResponse response = null; // Get secret key String 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 theJSON String 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.
  • 37. 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 /WEBINF/classes. Mengimplementasikan JsonFactory adalah dengan menambahkan @Autowired di class Service, dalam kasus buku ini adalah PersonServiceImpl, sebuah implementasi dari PersonService. Berikut adalah settingnya @Autowired private 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.
  • 38. 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.