7 BAB II LANDASAN TEORI Bab ini menguraikan tentang teori-teori dasar yang berkaitan dengan pembuatan layanan berbasis web dengan JSON-RPC pada platform Java dan PHP, yang akan dijadikan sebagai landasan teori dalam penelitian ini. Beberapa teori dasar akan dibahas di bab ini, antara lain teori dasar tentang layanan berbasis web, JSON, JSON-RPC, Java, PHP, JavaScript, dll. 2.1 LAYANAN BERBASIS WEB (WEB SERVICE) Layanan berbasis web merupakan suatu teknologi yang bertujuan memudahkan komunikasi antar aplikasi, yang menggunakan standar yang tidak terikat platform dan juga tidak terikat dengan bahasa pemrograman yang digunakan oleh masing masing aplikasi. Definisi W3C (2011) : “A software sistem designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machineprocessable format (specifically web services Description Language WSDL). Other sistems interact with the web service in a manner prescribed by its description using SOAP messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards." (Suatu sistem perangkat lunak yang dirancang untuk mendukung interaksi mesin ke mesin pada suatu jaringan dengan lintas platform. Layanan berbasis web ini mempunyai sebuah penghubung yang diuraikan dalam suatu format yang dapat diproses oleh mesin seperti WSDL. Sistem lain yang berinteraksi dengan layanan berbasis web ini dilakukan melalui suatu penghubung menggunakan pesan seperti pada SOAP. Pada umumnya pesan ini dilakukan melalui HTTP dan XML yang merupakan salah satu standar web). 8 Seiring dengan perkembangan teknologi, format pertukaran data yang dapat digunakan dalam pembuatan sebuah layanan berbasis web tidak sebatas hanya XML saja, kita dapat juga menggunakan format pertukaran data lainnya misalnya JSON. 2.2 JSON JSON adalah suatu format pertukaran data yang memiliki karakteristik yang ringan, mudah dimengerti oleh manusia, serta memiliki kemudahan diterjemahkan oleh komputer. JSON dibuat berdasarkan bagian dari bahasa pemprograman JavaScript. Format JSON sendiri merupakan teks yang tidak bergantung terhadap bahasa pemprograman apapun, hal ini disebabkan karena gaya bahasa yang digunakan adalah gaya bahasa yang umum digunakan oleh pemrogram untuk bahasa pemrograman keluarga C termasuk didalamnya C, C++, C#, Java, JavaScript, Perl, Python dll. Sifat-sifat tersebut menjadikan JSON sangat ideal untuk digunakan sebagai format pertukaran data. 2.2.1 Struktur JSON Format JSON terdiri dari dua buah struktur, yaitu : 1. Sekumpulan pasangan nama/nilai Pada beberapa bahasa pemrograman tertentu, hal ini dinyatakan sebagai objek (object), rekaman (record), struktur (struct), kamus (dictionary), tabel hash (hash table), dan daftar berkunci (keyed list). 2. Daftar nilai terurutkan Untuk kebanyakan bahasa, hal ini dinyatakan sebagai larik (array), vektor (vector), daftar (list), atau urutan (sequence). 2.2.2 Bentuk JSON JSON menggunakan bentuk sebagai berikut : 9 1. Objek(Object) Merupakan sepasang nama/nilai yang tidak terurutkan. Penulisan objek dimulai dengan karakter “{“ (kurung kurawal buka) dan diakhiri dengan karakter “}” (kurung kurawal tutup). Setiap nama selalu diikuti dengan karakter “:” (titik dua), dan setiap pasangan nama/nilai dipisahkan oleh karakter “,” (koma) Gambar 2.1 Objek JSON / JSON Object 2. Larik(Array) Larik adalah kumpulan nilai yang terurutkan. Larik selalu dimulai dengan karakter “[“ (kurung kotak buka) dan diakhiri dengan karakter “]” (kurung kotak tutup). Setiap nilai dipisahkan oleh karakter “,” (koma). Gambar 2.2 Larik JSON / JSON Array 2.2.3 Istilah Dalam JSON Berikut penjelasan istilah yang digunakan pada sub-bab 2.2.1 dan 2.2.2 : 1. Nilai (value) Merupakan sebuah string dalam tanda kutip ganda, angka, true /false , null, sebuah objek atau sebuah larik. Struktur-struktur tersebut dapat disusun bertingkat, seperti berikut : 10 Gambar 2.3 Nilai JSON /JSON Value 2. String Merupakan kumpulan dari nol atau lebih karakter yang dibungkus dengan tanda kutip ganda. Di dalam string dapat digunakan karakter "\" untuk membentuk karakter khusus. Sebuah karakter mewakili karakter tunggal pada string. String sangat mirip dengan string C atau Java. Gambar 2.4 JSON String 3. Angka Sangat mirip dengan angka di C atau Java, kecuali format oktal dan heksadesimal tidak digunakan. 11 Gambar 2.5 Angka JSON/JSON Number 4. Spasi kosong Dapat disisipkan di antara pasangan tanda-tanda tersebut, kecuali beberapa detil yang secara lengkap dipaparkan oleh bahasa pemprograman yang bersangkutan. 2.3 RPC RPC merupakan salah satu protokol yang cukup sederhana yang banyak digunakan saat ini untuk membangun suatu layanan berbasis web. Definisi RPC menurut Dave Marshall (1999) : “RPC is a powerful technique for constructing distributed, client-server based applications. It is based on extending the notion of conventional, or local procedure calling, so that the called procedure need not exist in the same address space as the calling procedure. The two processes may be on the same sistem, or they may be on different sistems with a network connecting them” (RPC merupakan suatu teknik untuk membangun aplikasi berbasis client-server terdistribusi. RPC dibuat berdasarkan pada konsep pemanggilan sub-rutin lokal, sehingga sub-rutin yang akan dipanggil tidak harus berada pada sistem yang sama. Dua buah pemrosesan bisa jadi berada pada sistem yang sama , atau bisa juga berada pada sistem yang berbeda yang dihubungkan melalui sebuah jaringan). 12 RPC memungkinkan kita untuk mengakses sebuah sub-rutin yang berada pada aplikasi lain meskipun aplikasi tersebut berada pada sistem dan pada mesin yang berbeda. Untuk dapat melakukan ini sebuah aplikasi di server harus menyediakan sekumpulan sub-rutin yang dapat diakses oleh aplikasi client. Pendekatan yang dapat dilakuan adalah sebuah server membuka soket, lalu server akan menunggu client yang memanggil sub-rutin yang disediakan oleh server. Protokol RPC menggunakan suatu format data tertentu untuk pertukaran datanya, format data yang banyak di gunakan adalah menggunakan teknologi XML, protokol dengan XML ini biasanya dinamakan dengan XML-RPC. Namun seiring perkembangan teknologi , ditemukan sebuah format pertukaran data baru yaitu JSON , yang mempunyai kelebihan dibandingkan XML , antara lain sifat dari JSON yang ringan , mudah dibaca oleh manusia, mudah ditulis oleh manusia, dan juga ukurannya yang kecil , sehingga byte yang dihasilkannya pun akan lebih kecil daripada XML. Hal ini tentu berguna untuk pemrosesan datanya nanti, yang akan lebih cepat dibandingkan XML. Protokol RPC yang menggunakan JSON sebagai format pertukaran datanya disebut dengan JSON-RPC. 2.4 JSON-RPC Konsep dasar dari JSON-RPC itu sendiri sangat sederhana, yaitu sebuah mekanisme umum yang terdiri dari dua buah sistem yang terhubung melalui sebuah koneksi data. Selama koneksi tersebut tetap ada, suatu sistem dapat melakukan pemangilan terhadap suatu sub-rutin yang terdapat pada sistem lain. Untuk melakukan pemanggilan jarak jauh terhadap suatu sub-rutin, maka sebuah objek permintaan ataupun objek notifikasi akan di kirimkan oleh client terhadap server, kemudian server akan memberikan hasil pemrosesannya berupa objek balasan terhadap objek permintaan tersebut, kecuali jika yang di kirimkan oleh client adalah berupa objek notifikasi , maka server tidak akan memberikan objek balasan sebagai balasan terhadap client. 2.4.1 Spesifikasi JSON-RPC 13 Berikut ini adalah spesifikasi resmi dari JSON-RPC 2.0 yang merupakan versi terakhir dari teknologi JSON-RPC ketika tulisan ini dibuat. 2.4.1.1 Objek permintaan (request object) Untuk memanggil sebuah sub-rutin di server penyedia layanan berbasis web, maka sebuah pemintaan dilakukan oleh client tehadap server penyedia layanan berbasis web yang menyediakan sub-rutin tersebut. Permintaan tersebut diimplementasikan dalam bentuk sebuah objek permintaan, yang berupa sebuah objek tunggal yang disandikan dalam format JSON. Sebuah objek permintaan memiliki tiga buah atribut, yaitu : 1. Jsonrpc Atribut ini adalah atribut dengan tipe string untuk menandakan versi dari protokol JSON-RPC. Dalam JSON-RPC 2.0 , atribut ini harus selalu di set dengan nilai “2.0“. 2. Method Atribut ini adalah atribut dengan tipe string yang berisi nama dari subrutin yang akan di panggil 3. Params Atribut ini merupakan sebuah variabel larik yang berisi sekumpulan objek untuk memetakan argumen terhadap suatu sub-rutin 4. Id Atribut ini sebuah identitas tehadap suatu objek permintaan, tipe nya bisa apa saja. Identitas ini berguna untuk memetakan antara objek balasan dan objek permintaan yang akan dikirimkan. Sebuah objek permintaan memiliki format dalam bentuk JSON, format nya adalah sebagai berikut : 1. Pemanggilan sub-rutin dengan posisi parameter Format : {"jsonrpc": "2.0", "method": [nama sub-rutin], "params": [parameter 1, parameter 2, dst], "id": [Identitas dari objek permintaan]} 14 Contoh : {"jsonrpc": "2.0", "method": "daftarFilm", "params": [“horror”,”barat”], "id": “A1”} 2. Pemanggilan sub-rutin dengan nama parameter Format : {"jsonrpc": "2.0", "method": [nama sub-rutin], "params": {“nama parameter”:parameter 1, dst}, "id": [Identitas dari objek permintaan]} Contoh : {"jsonrpc": "2.0", "method": "daftarFilm", "params": {“kategori_film”:“horror”,”jenis_film””barat”], "id":” A1”} 2.4.1.2 Objek notifikasi (notification object) Objek notifikasi adalah sebuah objek permintaan khusus yang tidak memerlukan nilai balikan berupa objek balasan dari server. Objek ini merupakan sebuah objek tunggal yang disandikan dalam bentuk JSON. Atribut yang dimiliki sama persis dengan objek permintaan, tetapi dengan beberapa pengecualian yaitu atribut “Id” harus selalu di set null, hal ini karena server tidak akan memberikan objek balasan pada setiap objek notifikasi yang dikirimkan . Objek notifikasi dikirimkan ketika client akan melakukan pemanggilan terhadap sub-rutin, tetapi client tidak memerlukan objek balikan. Penggunaan object notifikasi ini memiliki kelemahan , yaitu client tidak akan pernah tahu jika terjadi kesalahan dan munculnya kesalahan ketika proses pemanggilan terhadap sub-rutin. Format penulisannya adalah sebagai berikut : Format : {"jsonrpc": "2.0", "method": [nama sub-rutin], "params": [parameter 1, parameter 2, dst]} Contoh : {"jsonrpc": "2.0", "method": "daftarFilm", "params": [“horror”,”barat”]} 2.4.1.3 objek balasan (response object) Ketika suatu pemrosesan terhadap suatu sub-rutin selesai dilakukan , penyedia layanan berbasis web harus memberitahu client dengan mengirimkan 15 sebuah objek balasan, berupa sebuah objek tunggal yang disandikan dalam format JSON, yang memiliki tiga buah atribut yaitu : 1. Jsonrpc Atribut ini adalah atribut dengan tipe string untuk menandakan versi dari protokol JSON-RPC. Dalam JSON-RPC 2.0 , atribut ini harus selalu di set dengan nilai “2.0“. 2. Result Atribut ini adalah sebuah nilai balikan dari sub-rutin yg dipanggil .Atribut ini di set null jika terjadi kesalahan pada saat pemrosesan sub-rutin tersebut. 3. Error Atribut ini berisi sebuah object kesalahan yang akan di kembalikan jika terdapat kesalahan ketika proses pemanggilan sub-rutin, tapi atribut ini akan di set null jika tidak ada kesalahan ketika pemrosesan 4. Id harus Id yang sama dengan Id yg di tentukan pada objek permintaan Sebuah objek balasan memiliki format dalam bentuk JSON, format nya adalah sebagai berikut : Format : {"jsonrpc": "2.0", "result": [hasil], "id": [Identitas dari objek permintaan]} Contoh : {"jsonrpc": "2.0", "result": [“film horror 1”,”film horror 2”], "id": “A1”} 2.4.1.4 objek balasan kesalahan (error response object) Pemanggilan terhadap sub-rutin terkadang mengalami kegagalan dalam pemrosesannya , dalam hal ini server harus dapat mengantisipasinya, yaitu dengan mengirimkan sebuah objek balasan yang berisi informasi kesalahan yang terjadi ketika pemanggilan sub-rutin tersebut Sebuah objek balasan kesalahan memiliki format dalam bentuk JSON, format nya adalah sebagai berikut : 16 Format : {"jsonrpc": "2.0", "error": {"code": [kode kesalahan], "message": [pesan kesalahan]}, "id": null} Contoh : {"jsonrpc": "2.0", "error": {"code": -32600, "message":"Invalid Request."}, "id": null} 2.4.1.5 Tabel kode kesalahan Table berikut menunjukan daftar kode kesalahan dan pesan yang akan di kirimkan aplikasi server kepada aplikasi client jika terjadi masalah ketika proses pemanggilan terhadap sub-rutin Tabel 2.1 Daftar Kode Kesalahan JSON-RPC Kode -32700 Pesan Kesalahan Keterangan Kesalahan dalam Terjadi ketika server menerima sebuah proses parsing JSON dengan format yang tidak valid (bukan format JSON) yang dikirimkan oleh client dan menyebabkan sebuah kesalahan ketika server mencoba menterjemahkan objek JSON tersebut -32600 -32601 -32602 Objek Permintaan Terjadi ketika objek JSON yang dikirim tidak valid client bukan objek permintaan yang valid Sub-rutin tidak Terjadi ketika sebuah sub-rutin dari sebuah ditemukan objek permintaan tidak terdaftar di server Kesalahan parameter Kesalahan dalam pengiriman parameter terhadap sebuah sub-rutin -32603 Kesalahan Internal Kesalahan internal JSON-RPC -32099 Kesalahan Server Disediakan untuk kesalahan yang di to -32000 definisikan sendiri disisi server 2.4.2 Mekanisme komunikasi data pada JSON-RPC Berikut ini adalah mekanisme komunikasi data pada JSON-RPC. 17 2.4.2.1 Alur proses pada JSON-RPC Sebuah pemanggilan terhadap sebuah sub-rutin di server oleh client sama halnya seperti ketika melakukan pemanggilan terhadap suatu sub-rutin lokal. Ketika sebuah RPC dilakukan, parameter masukan dipetakan terhadap sebuah sub-rutin yang ada di server penyedia layanan, dan client yang melakukan pemanggilan terhadap sub-rutin tersebut menunggu sebuah objek balasan yang akan dikembalikan dari sub-rutin yang di panggil. Gambar 2.6 Alur proses pada JSON-RPC Gambar tersebut menjelaskan tentang mekanisme umum yang terjadi pada JSON-RPC. Pada gambar tersebut terdapat dua buah mesin yang saling berkomunikasi melalui suatu jaringan, yaitu mesin client dan mesin server. RPC Client RPC client merupakan mesin yang akan melakukan pemanggilan terhadap sub-rutin yang disediakan oleh server RPC. Pada mesin ini terdapat komunikasi di layer aplikasi client. Pada saat aplikasi client akan melakukan pemanggilan terhadap suatu sub-rutin, maka aplikasi tersebut harus terlebih dahulu berkomunikasi dengan RPC Client Stub untuk memberitahukan sub-rutin mana yang akan dipanggil, kemudian RPC Client stub akan membuat sebuah objek permintaan sesuai fungsi yang di maksud pada aplikasi client, objek permintaan tersebut nantinya akan dikirimkan ke RPC Server sudah dalam format JSON. RPC Client stub inilah yang bertanggung jawab untuk berkomunikasi secara langsung dengan server penyedia layanan berbasis web. RPC Server 18 RPC Server merupakan mesin penyedia layanan layanan berbasis web, di mesin inilah semua sub-rutin tersedia. RPC server memiliki RPC Server Stub yang akan menerima semua objek permintaan yang dikirimkan oleh client. Bagian ini juga yang akan menangani masalah pengiriman objek balasan terhadap client. Ketika sebuah objek permintaan di terima, maka RPC Server Stub akan menentukan sub-rutin mana yang akan di eksekusi sesuai dengan objek permintaan yang masuk. Setelah menentukan sub-rutin mana yang akan dieksekusi, selanjutnya akan di kirimkan hasil pemrosesannya berupa objek balasan ke client sesuai dengan ID dari objek permintaan yang dikirim. Objek balasan yang di kirimkan sudah dalam bentuk fomat JSON. Komunikasi Data JSON-RPC Pada bagian berikut ini akan dijelaskan mengenai contoh komunikasi yang dapat terjadi pada JSON-RPC, penyajiannya adalah dalam bentuk contoh pengiriman objek permintaan dari client ke server dan contoh pengiriman objek balasan dari server ke client. Pemanggilan sub-rutin dengan posisi parameter {"jsonrpc": "2.0", "method": "pembagian", "params": [12,4], "id": 1} {"jsonrpc": "2.0", "result": 3, "id": 1} Pemanggilan sub-rutin dengan nama parameter {"jsonrpc": "2.0", "method": "pembagian", "params": {"bilangan_dibagi": 12,"bilangan_pembagi": 4}, "id": 3} {"jsonrpc": "2.0", "result": 3, "id": 3} Pemanggilan sub-rutin dengan objek notifikasi {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]} Pemanggilan sub-rutin yang tidak terdaftar {"jsonrpc": "2.0", "method": "perkalian", "id": "1"} {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Procedure not found."}, "id": "1"} Pemanggilan sub-rutin dengan format JSON yang tidak valid {"jsonrpc": "2.0", "method": "perkalian, "params": "12", "baz] {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error."}, "id": null} 19 Pemanggilan sub-rutin dengan format JSON-RPC yang tidak valid [1,2,3] {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request."}, "id": null} {"jsonrpc": "2.0", "method": 1, "params": "perkalian"} {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request."}, "id": null} Keterangan : Data yang dikirim ke penyedia layanan berbasis web (objek permintaan,/objek notifikasi) Data yang di kirim dari penyedia layanan berbasis web ke client (objek balasan) 2.5 JAVA Java adalah bahasa pemrograman yang berorientasi objek (OOP) dan dapat dijalankan pada berbagai platform sistem operasi. 2.5.1 Karateristik Java Java memiliki karakteristik sebagai berikut : 1. Sederhana Java menggunakan sintaks yang mirip dengan C++. Namun sintaks ada beberapa sintaks yg telah diperbaiki, antara lain menghilangkan penggunaan pointer yang rumit dan multiple inheritance. Selain itu juga Java juga menggunakan alokasi memori secara otomatis dan pengumpulan objek sampah secara otomatis. 2. Berorientasi objek Java menggunakan pemrograman berorientasi objek yang membuat program dapat dibuat secara modular dan dapat dipergunakan kembali. Pemrograman berorientasi objek memodelkan dunia nyata kedalam objek dan melakukan interaksi antar objek-objek tersebut. 20 3. Terdistribusi Java dibuat untuk membuat aplikasi terdistribusi, hal ini didukung dengan adanya pustaka jaringan yang sudah terintegrasi pada Java. 4. Interpreted Program Java dijalankan menggunakan interpreter yaitu Java Virtual Machine (JVM). Hal ini membuat kode program Java yang telah dikompilasi menjadi Java bytecodes dapat dijalankan pada platform yang berbeda-beda. 5. Kuat Java mempuyai reliabilitas yang tinggi. Compiler pada Java mempunyai kemampuan mendeteksi kesalahan secara lebih teliti dibandingkan bahasa pemrograman lain. 6. Aman Sebagai bahasa pemrograman untuk aplikasi internet dan terdistribusi, Java memiliki beberapa mekanisme keamanan untuk menjaga aplikasi dan tidak merusak sistem komputer yang menjalankan aplikasi tersebut. 7. Arsitektur yang netral Program Java merupakan platform yang berdiri sendiri. Program cukup mempunyai satu buah versi yang dapat dijalankan pada platform berbeda dengan mesin virtual Java. 8. Portabel Program Java dapat dengan mudah dijalankan pada platform yang berbeda-beda tanpa harus dikompilasi ulang. 9. Performa Performa pada Java cukup baik dalam hal kecepatan dan kekuatannya. 10. Dinamis Java dirancang untuk dijalankan di lingkungan yang dinamis. Perubahan pada suatu kelas dengan menambahkan atribut ataupun sub-rutin dapat dilakukan tanpa menggangu program yang pengguna kelas tersebut. 2.5.2 Fase-Fase Pada Pemrograman Java 21 Gambar dibawah ini dapat menjelaskan aliran proses kompilasi dan eksekusi dari sebuah program Java : Gambar 2.7 Proses Kompilasi Dan Eksekusi Program Java Langkah pertama dalam pembuatan program berbasis Java adalah menuliskan kode program pada editor. Kode program kemudian disimpan dalam sebuat file berekstensi .java. Selanjutnya file tersebut dikompilasi menggunakan Java Compiler, sehingga menghasilkan sebuah file bytecode dengan ekstensi .class. File tersebut kemudian akan dikonversikan oleh Java Interpreter menjadi bahasa mesin sesuai dengan jenis dan platform yang digunakan. 2.6 PHP PHP (PHP Hypertext Preprocessor) merupakan bahasa pemrograman berbasis web yang mampu memproses data secara dinamis. PHP akan sepenuhnya dijalankan oleh server tetapi disertakan pada halaman HTML biasa. Aplikasiaplikasi yang dibangun oleh PHP pada umumnya akan memberikan hasil pada web browser, tetapi prosesnya secara keseluruhan dijalankan di server. Pada prinsipnya server akan bekerja apabila ada permintaan dari client. Dalam hal ini client menggunakan kode-kode PHP untuk mengirimkan permintaan ke server. Ketika menggunakan PHP sebagai bahasa script aplikasi server, maka server akan melakukan hal-hal sebagai berikut : 1. Membaca permintaan dari client 2. Mencari halaman/page di server 3. Melakukan instruksi yang diberikan oleh PHP untuk melakukan modifikasi pada halaman. 22 4. Mengirim kembali halaman tersebut kepada client melalui internet atau intranet. PHP memiliki beberapa kelebihan yaitu dapat dijalankan pada platform yang berbeda-beda (Windows, Linux, Unix, etc.), selain itu PHP sangat mudah dipelajari 2.7 JAVASCRIPT JavaScript adalah suatu bahasa script yang didasarkan pada konsep pemrograman berbasis prototipe. Bahasa ini terutama terkenal karena penggunaannya di situs web (sebagai JavaScript sisi client) dan juga digunakan untuk menyediakan akses script untuk objek yang dilekatkan di aplikasi lain