RPC (Remote
Procedure Call), SOAP (Simple Object
Access Protocol), REST (Representational
State Transfer)
Pengertian Remote
Procedure Call (RPC)
Remote
Procedure Call (RPC) adalah
sebuah metode yang memungkinkan kita untuk mengakses sebuah prosedur yang
berada di komputer lain. Untuk dapat melakukan ini sebuah server
harus menyediakan layanan remote procedure.Pendekatan yang dilakuan
adalah sebuah server membuka socket, lalu menunggu client
yang meminta prosedur yang disediakan oleh server. Bila client tidak tahu
haruS menghubungi port yang mana, client bisa me-request
kepada sebuah matchmaker pada sebuah RPC port yang
tetap. Matchmaker akan memberikan port apa yang digunakan oleh
prosedur yang diminta client.
Prinsip Dasar RPC
Kelebihan RPC
- Relatif mudah digunakan :
Pemanggilan remote procedure tidak jauh berbeda dibandingkan
pemanggilan procedure. Sehingga pemrogram dapat berkonsentrasi pada software
logic, tidak perlu memikirkan low level details seperti socket,
marshalling & unmarshalling.
- Robust (Sempurna):
Sejak th 1980-an RPC telah banyak digunakan dlm pengembangan
mission- critical application yg memerlukan scalability, fault tolerance,
& reliability.
Kekurangan RPC
- Tidak fleksibel terhadap perubahan : Static relationship between client & server at run-time.
- Berdasarkan prosedural/structured programming yang sudah ketinggalan jaman dibandingkan OOP.
Struktur Protokol
Message RPC
- Call Message
Dilakukan
oleh klien, dimana meminta server untuk mengeksekusi suatu prosedur. Terdapat nilai-nilai
unsigned integer yang digunakan untuk mengidentifikasi prosedurremote yang
diminta:
1.
Nomor Program
2.
Nomor Versi dari Program
3.
Nomor Prosedur
- Reply Message
Dikirimkan oleh server jaringan, bervariasi
tergantung apakah call messages yang diminta
klien diterima atau ditolak. Reply message mengandung informasi yang digunakan
untuk membedakan kondisi-kondisi yang diminta sesuai dengan call messages.
Informasi ini antara lain :
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 dalamantrian untuk melihat apakah siap dibaca
atau ditulis,atau ditahan. (mengijinkan server untuk menginterupsi suatu
aktivitas.
Langkah-langkah dalam
RPC
1. Prosedur client memanggil
client stub
2. Client stub membuat pesan
dan memanggil OS client
3. OS client mengirim pesan ke
OS server
4. OS server memberikan pesan
ke server stub
5. Server stub meng-unpack
parameter-parameter untuk memanggil server
6. Server mengerjakan operasi,
dan mengembalikan hasilnya ke server stub
7. Server stub mem-pack hasil
tsb dan memanggil OS server
8. OS server mengirim pesan
(hasil) ke OS client
9. OS client memberikan pesan
tersebut ke client stub
10. Client stub meng-unpack
hasil dan mengembalikan hasil tersebut ke Client
Remote
Procedure Call dengan SunRPC
Salah
satu implementasi RPC (Remote Procedure Call) adalah dengan menggunakan SunRPC.
Dalam tutorial kali ini, saya akan mencontohkan pembuatan program sederhana
yang menggunakan SunRPC.
Service
yang disediakan oleh program adalah operasi matematika dasar, yaitu penjumlahan,
pengurangan, perkalian, pembagian, dan pencarian modulo.
Pendefinisian Service
Sebelum program yang menggunakan RPC
dibuat, kita harus mendefinisikan fungsi-fungsi atau prosedur-prosedur apa saja
yang akan dibuat.
Berikut ini adalah definisi service
yang akan kita buat.
struct
angka {
int a;
int b;
};
program
TAMBAHAN {
version TAMBAHANVER {
int tambah(angka) = 1;
int kurang(angka) = 2;
int kali(angka) = 3;
float bagi(angka) = 4;
int mod(angka) = 5;
} = 1;
} =
99;
Simpan text di atas ke dalam sebuah
file bernama tambah.x. Sekarang jalankan program rpcgen untuk mengubah file tersebut
menjadi client dan server stub.
rpcgen
tambah.x
Setelah program di atas dijalankan,
akan terbentuk empat buah file baru. Yaitu:
- tambah_clnt.c
- tambah_svc.c
- tambah.h
- tambah_xdr.c
Semua file tadi akan digunakan dalam
pembuatan program client dan server RPC.
Pembuatan Server
Program server akan
mengimplementasikan fungsi-fungsi pada server stub. Dalam program kali ini, ada
lima buah fungsi yang harus diimplementasikan, yaitu:
- int * tambah_1_svc(angka *, struct svc_req *)
- int * kurang_1_svc(angka *, struct svc_req *)
- kali_1_svc(angka *, struct svc_req *)
- bagi_1_svc(angka *, struct svc_req *)
- mod_1_svc(angka *, struct svc_req *)
Daftar fungsi-fungsi itu dapat
dilihat pada file tambah.h.
Berikut ini adalah implementasi
fungsi yang akan kita buat.
#include
<rpc/rpc.h>
#define
_RPCGEN_SVC
#include
"tambah.h"
int
* tambah_1_svc(angka *input, struct svc_req *req) {
static int hasil;
hasil = input->a + input-> b;
return &hasil;
}
int
* kurang_1_svc(angka *input, struct svc_req *req) {
static int hasil;
hasil = input->a - input->b;
return &hasil;
}
int
* kali_1_svc(angka *input, struct svc_req *req) {
static int hasil;
hasil = input->a * input-> b;
return &hasil;
}
float
* bagi_1_svc(angka *input, struct svc_req *req) {
static float hasil;
hasil = (float)input->a /
(float)input->b;
return &hasil;
}
int
* mod_1_svc(angka *input, struct svc_req *req) {
static int hasil;
hasil = input->a % input->b;
return &hasil;
}
Simpan source code di atas ke dalam
file tambah_server.c.
Setelah itu, lakukan kompilasi.
gcc
-o tambah_server tambah_server.c tambah_svc.c tambah_xdr.c
Pembuatan Client
Program yang akan menjadi client, dapat
menggunakan prosedur yang dijadikan sebagai remote procedure seolah-olah
prosedur/fungsi tersebut menjadi bagian dari program client.
Berikut ini adalah source code dari
program client yang akan kita buat.
#include
<rpc/rpc.h>
#define
_RPCGEN_CLNT
#include
"tambah.h"
int
main(int argc, char **argv) {
CLIENT *cl;
int *hasil;
float *hasil_float;
struct angka input;
if (argc < 2) {
printf("Masukkan alamat komputer
yang menyediakan service.n");
printf("Contoh: %s
localhostnn", argv[0]);
exit(1);
}
cl = clnt_create(argv[1], TAMBAHAN,
TAMBAHANVER, "tcp");
if (cl == NULL) {
clnt_pcreateerror(argv[1]);
exit(1);
}
cl->cl_auth = authunix_create_default();
input.a = 2;
input.b = 2;
printf("%d + %d = %dn", input.a,
input.b, *tambah_1(&input, cl));
printf("%d - %d = %dn", input.a,
input.b, *kurang_1(&input, cl));
printf("%d * %d = %dn", input.a,
input.b, *kali_1(&input, cl));
printf("%d / %d = %dn", input.a,
input.b, *bagi_1(&input, cl));
printf("%d %% %d = %dn", input.a,
input.b, *mod_1(&input, cl));
}
Simpan source code di atas ke dalam
file tambah_client.c. Setelah itu lakukan kompilasi.
gcc
-o tambah_client tambah_client.c tambah_clnt.c tambah_xdr.c
Simple Object Access Protocol (SOAP)
Konsep Dasar SOAP
SOAP singkatan dari Simple Object Access Protocol. SOAP adalah protokol untuk pertukaran informasi dengan desentralisasi dan terdistribusi. SOAP dibangun dengan menggunakan protokol komunikasi HTTP. Karena HTTP didukung oleh semua browser dan server, maka SOAP dapat berkomunikasi dengan berbagai aplikasi meskipun terdapat perbedaan sistem operasi, teknologi, dan bahasa pemrogramannya.
Peran SOAP di dalam teknologi web
service adalah sebagai protokol pemaketan untuk pesan-pesan (messages)
yang digunakan secara bersama oleh aplikasi-aplikasi penggunanya. Spesifikasi
yang digunakan tidak lebih seperti sebuah amplop biasa berbasis XML untuk
informasi yang ditransfer, serta sekumpulan aturan bagi translasi aplikasi dan
tipe-tipe data platform yang spesifik menjadi bentuk XML. Desain bentuk dari
SOAP membuatnya cocok untuk berbagai pertukaran pesan pada aplikasi.
Pesan SOAP
Sebuah pesan SOAP adalah sebuah
dokumen XML yang berisi elemen-elemen berikut:
- Envelope element yang mengidentifikasi dokumen XML sebagai sebuah pesan SOAP.
- Elemen header yang berisi informasi header. Elemen ini bersifat opsional.
- Elemen body yang berisi panggilan dan merespon informasi.
- Fault element yang berisi pesan kesalahan yang terjadi pada waktu proses. Elemen ini opsional.
NuSOAP
NuSOAP adalah library yang digunakan untuk membangun web service berbasis SOAP yang ditulis dengan menggunakan bahasa PHP.
NuSOAP adalah library yang digunakan untuk membangun web service berbasis SOAP yang ditulis dengan menggunakan bahasa PHP.
Sebagai
contoh, di bawah ini terdapat dua listing program pada sisi server dan
sisi client. Berikut contoh implementasi NuSOAP pada sisi server:
Kode
Program File server.php
<?phprequire_once(‘nusoap.php’);
$server = new soap_server;
$server->register(‘hello’);
function hello($name) {
return ‘Hello, ‘ . $name;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA :
”;
$server->service($HTTP_RAW_POST_DATA);
?>
Berikut implementasi NuSOAP untuk sisi klien:
Kode Program File client.php
<?php
require_once(‘nusoap.php’);
$client = new soapclient(‘http://localhost/soap/server.php’);
$result = $client->call(‘hello’, array(‘name’ => $_GET['name']));
echo $result;
?>
REST (Representational State Transfer)
REST (Representational State Transfer) adalah suatu design
arsitektur perangkat lunak yang digunakan untuk pendistibusian sistem
hipermedia seperti WWW (World Wide Web). REST arsitektur terdiri dari client and server. Proses transfer data
dimulai ketika client melakukan request ke server, kemudian server memproses
permintaan dari client dan meresponse balik dengan mengirimkan mengirimkan data
yang sesuai dengan permintaan client.
Apakah REST web service itu?
REST pada dasarnya setiap URL unik
adalah representasi dari beberapa objek. Kita dapat memperoleh konten-konten
objek tersebut menggunakan HTTP GET, untuk menghapusnya, kita dapat menggunakan
POST, PUT, atau DELETE untuk memodifikasi objek (dalam praktiknya, kebanyakan
service menggunakan POST untuk ini).
Keuntungan
REST
- bahasa dan platform agnostic
- lebih sederhana/simpel untuk dikembangkan ketimbang SOAP
- mudah dipelajari, tidak bergantung pada tools
- ringkas, tidak membutuhkan layer pertukaran pesan (messaging) tambahan
- secara desain dan filosofi lebih dekat dengan web
Kelemahan
REST
- Mengasumsi model point-to-point komunikasi - tidak dapat digunakan untuk lingkungan komputasi terdistribusi di mana pesan akan melalui satu atau lebih perantara
- Kurangnya dukungan standar untuk keamanan, kebijakan, keandalan pesan, dll, sehingga layanan yang mempunyai persyaratan lebih canggih lebih sulit untuk dikembangkan ("dipecahkan sendiri")
- Berkaitan dengan model transport HTTP
Implementasi REST Web Services
memiliki empat dasar prinsip desain yaitu:
- Gunakan metode HTTP secara eksplisit.
- Stateless.
- URI berbentuk seperti direktori.
- Ditransfer menggunakan XML, JavaScript Object Notation (JSON), atau keduanya.
Contoh Source code untuk REST
sebagai berikut :
<?php
require
'Slim/Slim.php';
require
'db.php';
\Slim\Slim::registerAutoloader();
$app
= new \Slim\Slim(array(
'mode'
=> 'production',
'log.writer'
=> new \Slim\Extras\Log\DateTimeFileWriter(array(
'path'
=> './logs',
'name_format'
=> 'Y-m-d',
'message_format'
=> '%label% - %date% - %message%'
))
));
$app->contentType("application/json");
$app->get('/getProvinsis',
'getProvinsis');
$app->get('/getKabupatens/:id',
'getKabupatens');
$app->get('/getKecamatans/:id',
'getKecamatans');
$app->get('/getDesas/:id',
'getDesas');
//
Only invoked if mode is "production"
$app->configureMode('production',
function () use ($app) {
$app->config(array(
'log.enable'
=> true,
'log.level'
=> \Slim\Log::WARN,
'debug'
=> false
));
});
//
Only invoked if mode is "development"
$app->configureMode('development',
function () use ($app) {
$app->config(array(
'log.enable'
=> false,
'log.level'
=> \Slim\Log::DEBUG,
'debug'
=> true
));
});
$app->notFound(function
() use ($app) {
echo
'notFound coy';
});
$app->run();
//All
Functions goes here
function
getProvinsis()
{
global
$app;
$sql
= "select * FROM provinsi ORDER BY id";
try
{
$app->etag('getProvinsis');
$db
= getConnection();
$stmt
= $db->query($sql);
$provinsis
= $stmt->fetchAll(PDO::FETCH_OBJ);
$db
= null;
echo
json_encode($provinsis);
}
catch(\PDOException $e) {
echo
'{"error":{"text":'. $e->getMessage() .'}}';
}
}
function
getKabupatens($id)
{
$sql
= "SELECT * FROM kabupaten WHERE id_prov = :id";
try
{
$db
= getConnection();
$stmt
= $db->prepare($sql);
$stmt->bindParam("id",
$id);
$stmt->execute();
$kabupatens
= $stmt->fetchAll();
$db
= null;
echo
json_encode($kabupatens);
}
catch (\PDOException $e) {
echo
'{"error":{"text":'. $e->getMessage() .'}}';
}
}
function
getKecamatans($id)
{
$sql
= "SELECT * FROM kecamatan WHERE id_kabupaten = :id";
try
{
$db
= getConnection();
$stmt
= $db->prepare($sql);
$stmt->bindParam("id",
$id);
$stmt->execute();
$kecamatans
= $stmt->fetchAll();
$db
= null;
echo
json_encode($kecamatans);
}
catch (\PDOException $e) {
echo
'{"error":{"text":'. $e->getMessage() .'}}';
}
}
function
getDesas($id)
{
$sql
= "SELECT * FROM desa WHERE id_kecamatan = :id";
try
{
$db
= getConnection();
$stmt
= $db->prepare($sql);
$stmt->bindParam("id",
$id);
$stmt->execute();
$desas
= $stmt->fetchAll();
$db
= null;
echo
json_encode($desas);
}
catch (\PDOException $e) {
echo
'{"error":{"text":'. $e->getMessage() .'}}';
}
}
Diposting
olehh :
HELMI
MAHFUDHATUL HARUM
1100631026
/ MI. A