RESTful Web Services

Latar Belakang Web Services (Programmable Web)


Website yang kita buat tentu kita desain agar  manusia dapat dengan mudah dan nyaman untuk mengakses informasi yang ada didalamnya. Namun,  bagaimana jika yang mengakses website kita adalah sebuah program komputer? Sudah menjadi rahasia umum, jika programmer sering menggunakan cara tidak resmi untuk mendapatkan informasi yang ada dalam sebuah website  dengan teknik screen-scraping misalnya. Namun sayang, program komputer tidak se-fleksibel manusia dalam hal menafsirkan data yang ada dalam sebuah website. Maka, muncullah teknologi seperti RSS, XML-RPC, SOAP, RESTful Web Services, dll. Teknologi-teknologi tersebut dibuat untuk membuat website kita lebih mudah dibaca atau ditafsirkan oleh program komputer.

Apa Itu RESTful Web Services?


RESTful Web Services mengacu pada sebuah cara atau gaya dalam membangun sebuah sistem web services dengan memanfaatkan semua fitur/potensi yang dimiliki oleh teknologi HTTP (Hypertext Transfer Protcol) dan URI (Uniform Resource Interface). Berbicara tentang RESTful Web Services maka kita juga harus berkenalan dengan ROA (Resource Oriented Architecture), yaitu sebuah pondasi/panduan dasar untuk membangun RESTful Web Services. Arsitektur ini  diperkenalkan oleh  Leonard Richardson dan Sam Ruby dalam bukunya yang berjudul RESTful Web Services yang diterbikan oleh O’Reilly Media tahun 2007 (tips: buku wajib dibaca bagi yang ingin tahu lebih dalam mengenai konsep RESTful Web Services dan  ini open book jadi bisa didownload secara gratis dan legal).

So, apa saja pondasi dasar dari ROA tersebut. Berikut ini rangkumannya.

-  Resources

Dalam ROA resources merupakan bagaimana kita menyebut sesuatu objek yang penting, dibutuhkan oleh client, bentuknya bisa bisa berupa baris dalam tabel database, document, hasil dari menjalankan sebuah algoritma, dll. Lebih lanjut, jika kita lihat dari MVC paradigma, maka resources mengacu pada Model.

- URIs dan Addressability


URI (Uniform Resource Identifier) sangat berkaitan erat dengan resources, karena setiap resource harus memiliki URI, secara sederhana URI dapat dikatakan sebagai nama dan alamat dari sebuah resource yang membuatnya bisa diakses melalui web. Contohnya https://api.domain.com/v1/posts/34, dengan adanya URI tersebut kita dapat dengan mudah mengakses sebuah resource yaitu post dengan id 34.


- Statelessness


Statelessness berarti setiap HTTP request yang diproses di server tidak tergantung dengan HTTP request sebelumnya. Setiap HTTP request harus mengirimkan informasi yang dibutuhkan agar request tersebut bisa diproses di server. 
Orang sering bingung membedakan antara resource state dan application state (session), resource state mengacu pada data yang harus kita simpan diserver, sedangkan application state mengacu pada user session (client session). Dan state yang harus kita jauhkan dari RESTful server kita adalah application state dengan kata lain RESTful Web Services sebaiknya didesain tanpa menggunakan session.

Mengapa statelessness ini penting? 

Karena memudahkan dalam proses horizontal scaling, saat satu server tidak cukup kita tinggal setup load balancer, tambah server kedua, ketiga, dan seterusnya. Proses ini lebih mudah dilakukan tanpa adanya session (client state/application state) yang tersimpan diserver. (lebih lanjut baca halaman 222 di buku RESTful Web Services).

- Representations


Bagaimana resources kita direpresentasikan kepada client inilah yang dimaksud dengan Representations, apakah resources kita akan direpresentasikan dalam format XML, JSON, dan sebagainya. RESTful Web Services yang baik mendukung content negotiation, artinya bagaimana resources kita direpresentasikan kepada client dapat kita atur saat melakukan HTTP request.

- Links and Connectedness


Links and Connectedness mengacu pada bagaimana sebuah representasi dari resources menyajikan link untuk mengakses resources yang lain, contoh paling sederhana adalah pagination link yang disertakan dalam HTTP response.

- The Uniform Interface


The Uniform Interface mengacu pada HTTP verb methods seperti GET, POST, PUT, DELETE, OPTIONS, HEAD, dll. Dalam RESTful web service *sebuah URI bisa mendukung banyak http method*. 
Contoh untuk URI https://api.domain.com/v1/posts/34, kita dapat memberitahu server bagaimana server tersebut memproses sebuah HTTP request melalui HTTP verb methods. Misalkan kita ingin menghapus resource tersebut maka kita tinggal membuat HTTP request dengan method DELETE ke URI tersebut.
Sebuah URI harus mendukung OPTIONS and HEAD method, dimana OPTIONS memberikan informasi kepada client method apa saja yang didukung, sedangkan HEAD memberikan overview informasi resource dari URI tersebut.


Membangun RESTful Web Services menggunakan Yii2


Membangun RESTful Web Services menggunakan Yii2 begitu magic. Yii2 sudah dengan baik menerapkan arsitektur ROA (Resource Oriented Architecture) dan terdokumentasi  begitu lengkap di (http://www.yiiframework.com/doc-2.0/guide-rest-quick-start.html). 
Hal yang harus  dilupakan  saat kita akan menggunakan Yii2 untuk membangun Web Services adalah View dari MVC, artinya tidak ada View yang akan kita buat. Kita akan sering main main dengan Model dan sedikitnya dengan Controller dan URL rules configuration. 

- Model as Resources


Seperti yang sudah disinggung sebelumnya, dalam paradigma MVC, Models akan menjadi resources dari aplikasi kita. 
Saat kita bermain dengan Model untuk RESTful Web Services di Yii2 ada 2 method khusus yang sering kita override yaitu yii\db\ActiveRecord::fields() dan  yii\base\Model::extraFields()

- Controller


Controller berfungsi untuk memproses request dari client dan menggenerate response ke client. Yii2 memiliki yii\rest\ActiveController yang dapat membantu kita membuat RESTful Web Services standard untuk operasi CRUD dari model activerecord dengan cepat. Base controller ini secara default sudah mendukung HTTP method validation, content negotiation, authenticating, dan rate limiting.

- Routing untuk URI


Kita juga akan sering bermain dengan Routing,  bagaimana sebuah URI dengan method tertentu diarahkan ke sebuah action yang ada dalam controller. misalnya GET /posts/32 diarahkan ke actionView di PostController (post/view), DELETE /posts/32 diarahkan ke actionDelete di PostController, dan lain lain. Jadi dengan itu kita dapat memiliki sebuah URI yang support berbagaimacam method.
Yii2 memiliki yii\rest\UrlRule jika kita tidak ingin secara manual mengarahkan sebuah URI ke action tertentu. yii\rest\UrlRule sangat cocok digunakan untuk routing dari controller yang meng-extend yii\rest\ActiveController. Didalamnya terdapat sejumlah rules dasar untuk melakukan CRUD dari resources kita.

- Statelessness


Untuk menjadikan aplikasi Yii2 kita stateless adalah dengan mengkunfigurasi dua properti untuk user pada application component yaitu enableSession menjadi false, dan loginUrl menjadi null pada file konfigurasi kita.

- Links


Tentu Yii2 sudah mendukung salah satu konsep ROA ini, Yii2 akan mengirimkan response Header yang menginformasikan pagination dari resources yang sedang diakses. atau bisa juga kita atur agar link tersebut masuk kedalam response body.

- API Testing


Sebagaimana kita ketahui testing dapat kita lakukan secara manual dan otomatis (UAT vs Automated Code Testing). Begitupun dengan RESTful Web Services yang kita bangun dengan Yii2 dapat kita testing dengan kedua cara tersebut. Secara manual umumnya kita akan menggunakan software api client, yang paling populer adalah chrome app bernama Postman.Secara otomatis, kita  bisa menggunakan codeception (http://codeception.com/for/yii lihat pada bagian API test).
Kita juga dapat melakukan load testing secara otomatis menggunakan https://loader.io, melalui layanan ini, salah satunya kita dapat dengan mudah mengetahui berapa banyak client yang mampu ditangani oleh RESTful server kita dalam waktu bersamaan. 


Referensi:
Note:
Tulisan ini dipublikasikan pertama kali dalam WhatsApp group diskusi Yii Framework Indonesia hari Senin, 28 Novermber 2016

Comments



Popular posts from this blog

Membuat RESTful endpoint untuk Kontak

Google News Feed API Alternative