On Protocol

by barracobarner

Jumat sore gini enaknya ngomongin protokol nih…sebetulnya ngomongin yang satu ini gak bakalan ada habisnya (pada dasarnya subjek apapun gak bakal ada abisnya), karena pasti ada aja protokol baru dibuat, protokol lama terlupakan. Hal paling mengasyikkan dari main-main dengan protokol adalah prosesnya, pasti ada aja bug, masalah, kemacetan, ketidakjelasan, kekusrutan, kesemrawutan, kekacauan, … semua berjuang demi menciptakan protokol yang teruji, robust, berjalan pada berbagai kendala dan kondisi, gak ambigu, complete (ngejelasin skenario apapun bisa, gak kekurangan kosakata atau tata bahasa), dan concise (jika ada 2 jalan ke sesuatu, pilih yang terpendek, tercepat, paling murah, paling efisien).

Kalau definisi sederhanya: aturan untuk saling menukar data..nah gimana dengan web service. ada 2 kata di sini: layanan dan web, tapi kenapa disebut layanan ya..padahal tujuannya mengatakan: metode komunikasi, yang berarti juga protokol, kalau kata web sih sudah jelas.

Nah ceritanya ada 2 jenis web service: REST-compliant dan arbitrary. Kalo yg pertama itu operasi-operasi yang diijinkan pada layanan khusus yang RESTful saja, sedang yang kedua: operasi bebas gimana pembuatnya. Tentu bicara operasi gak melulu mirip operasi seroja atau operasi trikora, tapi lebih ke arah operasi seperti perhitungan matriks, pencarian database, identifikasi gambar, dsb. REST-compliant WS itu bicara soal operasi-operasi yang stateless, jadi masing-masing operasi: apakah itu pencarian data, update data, pembuatan atau penghancuran resource semuanya gak direkam statusnya, jadi tiap operasi bener-bener murni seperti operasi pencurian bank yang para pecurinya belum mengenal satu sama lain dan setelah berhasil dia akan bagi-bagi hasil abis itu berpencar dan menjalani hidup masing-masing seakan-akan tidak saling mengenal lagi, tentu ada banyak banget contoh-contoh ceritanya jika orang tertarik untuk membaca satu per satu.

Tapi mari kita bicara mengenai REST dulu, lanjut dengan bicara SOAP.

Dan sebelum bicara REST, perlu bicara protokol HTTP dulu, protokol satu ini punya banyak kosakata, antara lain kode request dan response spt 200, 3xx, 404, 5xx, dst. Terus ada yang namanya tipe media. Ada juga yang namanya metode request: GET, POST, PUT, DELETE. Tujuan REST adalah mengelola web resource, dan tiap resource diberi ‘nama’ atau identifikasi berupa URI. Proses manipulasi resource ini dilakukan dengan para komponen saling lempar, tukar, kirim, tendang representasi dari komponen itu sendiri. Representasi dari komponen itu ibaratnya, jika punya lingkaran representasinya cukup titik tengah dan radius, jika punya informasi mengenai radar mungkin mungkin cukup: merk, pembuat, model, tipe, dan “spesifikasi cepatnya”. Mereka dinyatakan = direpresentasikan baik sebagai XML, CSV, JSON, dll.

Jadi seseorang yang mau gunakan web service ini butuh identitas dan nama/jenis aksi/operasi yang diinginkan, dan bing…mendapatkan layanan deh.

…to be cont’d

Now, update sedikit baca QA sexist ini atau ini kita lihat web page itu representasi resource dan resource gampangnya itu secangkir kopi hangat, operasi padanya bisa mengangkat, menyenggol, melempar ke muka farhat amblas, meminum, dll. ditilik dari segi bahasa, ada kata benda dan kata kerja, kata benda jadi resource dan kata kerja spt GET, PUT, DELETE, POST, dsb jadi operasi. di konsep OOP polimorfism menyatakan bahwa kata kerja yang sama (misal GET) bisa dilakukan oleh berbagai benda yang berbeda, katanya provisi dari/ke/oleh satu interface (~ kata kerja, operasi) ke entitas yg berbeda-beda jenisnya (~ kata benda, resource).

Contoh implementasi polim ini biasanya sebuah fungsi (gampangnya aritmatika spt tambah, kali, kurang, bagi)  yang ‘signature’ nya bisa beda-beda, ada kembalikan short, integer, float, double, ada yang terima 2 parameter, 3, 4, …, ini disebut ad hoc polymorphism.

Jenis kedua adalah parametric polymorphism yang suka disebut generics di java atau template di C++. dan terakhir ada yang namanya subtyping atau inclusion polymorphism dimana jika kita punya fungsi yg terima parameter bertipe Bapak, bisa kita lempar argumen bertipe Anak asalkan Anak itu turunan Bapak. Dalam contoh ini biasanya si Anak punya overriden fungsi (versi dia sendiri) yang berbeda dengan versi Bapaknya, jadi kalau kita lempar argumen tipe Anak maka fungsi yang dipanggil adalah fungsi versi si Anak.

Bicara mengenai subtyping tidak terlepas dari bicara prinsip substitusi Livkov yang bilang objek bertipe Bapak itu harus bisa diganti oleh objek bertip Anak tanpa ganggu atau rusak sifat / karakter / properti dari program. Asumsikan Bapak cuma lulus SD, anak bisa lulus S1, atau Bapak lulus SMA anak lulus S3…semua kemampuan Bapak ‘dimiliki’ oleh kemampuan Anak. Jika kita ‘lihat’ dunia mikro objek dari kode, kita lihat jumlah bit dari Anak ini lebih gede dari si Bapak, kita lihat otak si Anak ini lebih berisi dari si Bapak. si Bapak dibilang general atau generalization, sedangkan si Anak dibilang specialized atau specialization…jadi istilah spesialisasi lebih gede/gendut/gemuk/gembrot/berisi dari istilah generik. makanya harga obat generik lebih murah, gak nyambung.

Back to REST, protokol http, dan dunia web itu berkutat seputar orang ‘minta’ dan web server ‘ngasih’, jadi operasi paling banyak itu operasi GET. katanya http itu protokol serba guna utk apply verb ke noun = aka aksi GET ke web resource. Alkisah web page itu (operasi-operasinya dlm hal ini) dikatakan operasi yg dimaksudkan dimengerti oleh manusia (high level, abstrak) makanya punya nama yg gampang dimengerti, konsep REST ini berhubungan dg gimana bikin mesin bisa bicara dlm bahasa tingkat tinggi spt ini, jadi mengaplikasikan bahasa tingkat tinggi ke otak primitif.

Haree genee, kita lihat web application tuh gak hanya mikir browser dan manusia inputtin alamat ke URL box nya browser, atau dia isi form dan klik submit. tapi kita juga pikir terima AJAX call yang ngasih JSON dan minta JSON, XmlHttp yang minta XML, jadi kombinasi {HTML,JSON,XML} bisa dioperasikan pada sejumlah URL yang kita contohkan di bawah. Utk aplikasi ASP.NET ada tersedia WCF REST API yg bisa langsung kita pakai, tapi ini tambah WCF API layer ke controller.

Anggap saja pengen bikin aplikasi news
News/ -> jk diakses kembalikan daftar news terbaru, POST ke sini tambah news baru
News/0001 -> kembalikan news ber-id 0001, alamat ini dukung juga U/D dari CRUD
News/0001/info -> kembalikan metadata dari news: judul, tanggal, penulis, ringkasan, keyword, dll, dukung POST utk tambah info baru mengenai news beri-id 0001
People/0001/articles/001 -> kembalikan artikel yang ditulis oleh orang ber-id 0001, dan terima operasi U/D dari CRUD utk alamat tsb.

News/…/Info, People/…/Articles, dll itu nyatakan hierarchical entity model jadi ada beberapa level of entity. gampangnya pohon yang tinggi ada banyak cabang dan level, utk dapatkan daun butuh sebuah routing. Dalam aplikasi web biasanya routing diimplementasikan dlm bentuk semacam regex dan aksi.

Mau oprek pake ASP.NET dulu, eh gak ketemu reference dll ternyata ada di sini:

system.web.mvc.dll

Advertisements