Tuesday, September 29, 2015

Membangun Restfull Webservices Dengan Codeigniter

Web Services

Sebelum masuk lebih dalam ada baiknya kita membahas sedikit tentang dasarnya, walapun tidak detil mudah-mudahan bisa membantu untuk tahap selanjutnya, apa itu Webservices ? teknologi Web telah diperkirakan akan menjadi teknologi yang lebih dari sekedar untuk mengirimkan web pages (Dokumen HTML) antara HTTP client dan server, terlebih dengan semakin luasnya penggunaan teknologi ini untuk saling mengirim informasi dan service (Service disini diartikan sebagai fungsi software yang mengandung bussiness task, menyediakan akses ke file-file teks, dokumen, gambar, video, audio dll, atau melakukan fungsi common seperti authentication dan logging). Istilah Web Services akhirnya muncul.

Secara terminologi web service memiliki berbagai definisi,

Quote:web service adalah interface yang dapat diakses melalui jaringan untuk memanggil fungsi aplikasi yang dibangun menggunakan standard teknologi internet [Tidwell, Snell, Kulchenko: 2001].
Quote:Web service adalah sebuah e-service yang diidentifikasi dengan URI yang ditampilkan ke khalayak umum[Weindhart:2011].

Sedangkan menurut World Wide WebConsortium (http://www.w3.org)

Quote:web service adalah sistem komputer yang saling bertukar XML message dengan sistem lain yang menggunakan HTTP sebagai protokol komunikasinya.

Dengan kata lain jika sebuah aplikasi dapat diakses melalui jaringan menggunakan kombinasi dari berbagai protokol seperti HTTP,XML,SMTP atau Jabber maka itu dapat dikatakan sebagai web service.

Ide untuk memanfaatkan teknologi Web hal tersebut mulai terealisasi secara nyata ketika pada tahun 1990-an akhir dan salah satu pendekatan implementasi web service yang paling banyak digunakan disebut dengan Simple Access Object Protocol (SOAP) yang memanfaatkan Extensible Markup Language (XML) yang belum lama muncul saat itu sebagai paket format untuk mekanisme Remote Procedure Call (RPC). Konsep SOAP yang merupakan web implementasi dari konsep RPC menjadi daya tarik bagi banyak orang untuk mengimplementasikannya dan setuju bahwa SOAP adalah web service sesungguhnya.
Setelah beberapa waktu sebagian orang mulai berpendapat SOAP tidak mengimplementasikan model sebenarnya dari “Web Service”. Menurut mereka SOAP “hanya” mengimplementasikan RPC melalui web. Beberapa tahun setelah kepopuleran “Web Service berbasis SOAP” muncul model implementasi yang dianggap lebih tepat disebut “Web Service” karena memiliki kedekatan prinsipal secara arsitektur terhadap teknologi web.

Model tersebut dinamakan REpresentational State Transfer (REST) dan karena prinsip tersebut menggunakan model REST maka web service yang menerapkannya disebut RESTful Web Services. Meskipun sebenarnya istilah REST sendiri pertama kali muncul tahun 2000 dari disertasi Roy Fielding.Meskipun muncul berbagai model implementasi dari web service, namun ada dua hal tambahan (tidak wajib, namun umum) yang umumnya diterapkan pada web service terlepas dari model implementasi yang diacu, yaitu :

Web Service harus self describing. Ketika developer mem-publish sebuah web service baru, maka harus disertakan pula public interface untuk service nya, minimal service baru tersebut menyediakan dokumentasi sebagai informasi untuk developer pengguna (client dari web service) sehingga developer pengguna lebih mudah mengintegrasikan aplikasi nya dengan web service tersebut. Jika menggunakan model implementasi SOAP, developer idealnya menyediakan public interface yang ditulis menggunakan grammar XML yang umum, XML tersebut dapat digunakan untuk mengenali semua method public, parameter dan nilai kembalian

Web Service harus discoverable. Ketika developer mem-publish sebuah web service baru, maka harus disediakan mekanisme sederhana agar pihak yang akan menggunakan web service tersebut mudah menemukannya.

Terdapat 2 area dimana web service menjadi solusi yang paling tepat untuk diimplementasi. Pertama adalah perusahaan software yang membuka API mereka kepada publik. Yang kedua adalah internal perusahaan besar untuk mendukung bisnin prosesnya.

Perusahaan web seperti Google, Yahoo!, Amazon dan Facebook menggunakan web service untuk menawarkan produk mereka dengan menggunakan infrastruktur hardware yang sudah sangat besar. Google dan Yahoo! Menawarkan search service, Amazon menawarakan on- demand hosting storage mereka dan Facebook menawarkan platform mereka untuk target marketing dan periklanan. Dengan adanya web service hal-hal tersebut menjadi sesuatu yang memungkinkan untuk dilakukan.

Web service juga digunakan untuk internal perusahaan besar untuk saling terhubung antar department yang terpisah. Proses implementasi untuk internal perusahaan besar relatif lebih mudah bagi web service developer karena penggunaan internal, hemat biaya, resiko keamanan yang tidak tinggi karena web service nya tidak terbuka untuk umum.
Dengan melakukan implementasi web service untuk internal perusahaan untuk menghubungkan banyak departemen agar dapat saling berbagi informasi melalui web service dibutuhkan arsitektur yang mendukung. Disinilah Service-Oriented Architecture(SOA) diterapkan. Mengimplementasikan SOA dalam internal perusahaan juga tidaklah mudah karena penerapannya bukan hanya melibatkan departemen IT namun juga level management yang lebih tinggi. Dengan kata lain menerapkan SOA membutuhkan investasi yang besar di IT dan perubahan strategi operasi

REST

REST sebenarnya bukan merupakan sebuah arsitektur tapi lebih mendekati kumpulan constraint(batasan) yang ketika diterapkan pada desain sebuah sistem, akan menjadi jenis arsitektur perangkat lunak. RESTful service harusnya memenuhi constraint-contraint seperti:

Resource Identification: Semua Resource (serta statenya) yang berhubungan dengan aplikasi diberikan identifier yang unik dan identifier tersebut harus bersifat global. Konsep resource disini bukan hanya hal statis yang langsung berhubungan dengan aplikasi namun juga termasuk informasi yang dibutuhkan seperti dokumen transaksi. RESTful resource adalah semua hal yang bisa diakses dan ditransfer melalui web antara client dan server. Dan karena protokol yang digunakan untuk berkomunikasi adalah HTTP, berbagai macam tipe file bisa ditransfer, teks file, flash movie,gambar dll. Sehingga dalam RESTful system representasi dari resource tergantung dari tipe yang direquest client (MIME type) yang didefinisikan didalam protokol request.

Uniform Interface: Semua interaksi sebaiknya dibangun dengan interface yang seragam. RESTful service menampilkan semua resource dan interaksinya dengan interface yang seragam, tidak seperti RPC yang menampilkan fungsi yang ada melalui method yang bisa dipanggil secara remote. Dalam RESTful web service untuk uniform interface ini menggunakan Uniform Resource Identifier(URI). URI pada RESTful webservice berupa hyperlink terhadap resource meskipun RESTful constraint tidak menyatakan URI harus berupa hyperlink, namun karena teknologi yang digunakan pada web service adalah web sehingga URI berupa hyperlink. Jika menggunakan teknologi lain, RESTful URI tentu akan berupa hal yang berbeda, namun tetap berupa address terhadap sebuah resource

Self-Describing Message: untuk setiap interaksi dengan resource melalui interface yang seragam, REST membutuhkan representasi dari resource yang menggambarkan semua aspek penting yang dimiliki oleh resource tersebut. Representasi dari resource sendiri adalah semua hal yang dikirim antara cilent dan server. Representasi merupakan state sementara dari data sebenarnya yang terletak di suatu tempat penyimpanan. Dengan kata lain representasi merupakan stream biner besama metadata yang menjelaskan bagaimana stream tersebut digunakan baik untuk client maupun untuk server. Bisa terdapat banyak jenis client yang me-request resource yang ada, oleh karena itu representasi setiap client pun dapat berbeda. Representasinya dapat berupa gambar, text file, stream XML atau stream JSON, tapi kesemua representasi tersebut harus tersedua melalui URI yang sama. Untuk kasus request yang dilakukan oleh manusia (human user) biasanya representasi berupa laman web sehingga menjadi bentuk representasi yang dapat dibaca.

Stateless Interaction: Setiap interaksi antara client dan server harus memiliki state sendiri (atau dengan kata lain tidak dipengaruhi session client). Jadi server hanya akan memantau resource state bukan client session

Semua Constraint tersebut tidak berpengaruh dengan teknologi yang akan digunakan untuk implementasi. Constraint tersebut hanya mendefinisikan bagaimana data ditransfer antar komponen dan keuntungan apa yang didapat. Dan tidak perlu mencari teknologi atau protokol jaringan baru untuk mengimplementasikannya, karena RESTful system dapat diaplikasikan ke infrastruktur jaringan yang sudah ada seperti web, sehingga muncullah RESTful service
Uniform Interface melalui HTTP Request

Representasi adalah mapping dari resource sebenarnya yang ditransfer antara client dan server. Pada web service representasi tersebut diajukan dengan komunikasi antara client dan server melalui protokol komunikasi HTTP.

Membangun sebuah RESTful web service akan sejalan dengan cara membangun sebuah aplikasi web masa kini. Akan tetapi hal paling dasar yang berbeda untuk membangun aplikasi web yang modern dan tradisional adalah bagaimana memodelkan aksi ke abstraksi data. Modern development menitikberatkan pada pertukaran resource, sedangkan tradisional development menitik beratkan pada aksi remote untuk mengambil data. Sehingga dapat disimpulkan modern development mengimplementasi RESTful web service sedangkan yang tradisional mengimplementasikan RPC-like service (Remote Procedure Call).

Pada proses development web modern tingkat ambiguitas design dan implementasi harus dibatasi karena sudah terdapat empat aksi spesifik yang bisa dilakukan terhadap resource, yaitu Create,Retrieve, Update dan Delete (CRUD). Sedangkan pada development tradisional web banyak sekali aksi yang tidak memiliki strandard penamaan dan implementasi yang dapat dilakukan.

Sehingga pada development web modern aksi CRUD tersebut dapat dimappingkan dengan HTTP method sebagai berikut :

Code:
CREATE -> POST
RETREIVE -> GET
UPDATE -> PUT
DELETE -> DELETE

Jadi secara sederhana dapat disimpulkan RESTful web service melakukan aksi dengan memanipulasi data dengan aksi crud, meskipun RESTful web service pun tidak selalu dibatasu dengan 4 aksi dasar tersebut, kerena bisa saja RESTful web service mengeksekusi logika pada server.

Metode GET

Metode ini digunakan untuk mengambil resource. Sebagai contoh terdapat web service yang menangani mahasiswa yang terdapat dalam universitas, dengan alamat http://api.server.local:8888/ Dalam contoh dibawah XML digunakan sebagai representasi data nilai siswa

Code:
<item>
<nama_siswa>Kurosaki Ichigo</nama_siswa>
<id_siswa>1</id_siswa>
<n_bahasa>90.90</n_bahasa>
<n_matematika>78.90</n_matematika>
<n_binggris>90.95</n_binggris>
</item>

Dan list dari nilai siswa akan direpresentasikan sebagai berikut.

Code:
<listSiswa>
<item>
<nama_siswa>Kurosaki Ichigo</nama_siswa>
<id_siswa>1</id_siswa>
<n_bahasa>90.90</n_bahasa>
<n_matematika>78.90<n_matematika>
<n_binggris>90.95</n_binggris>
</item>
<item>
<nama_siswa>Kurosaki Ichigo</nama_siswa>
<id_siswa>1</id_siswa>
<n_bahasa>90.90</n_bahasa>
<n_matematika>78.90<n_matematika>
<n_binggris>90.95</n_binggris>
</item>
</listSiswa>

Dengan representasi data nilai siswa seperti diatas maka jika membutuhkan web service untuk mengambil seluruh data nilai siswa URI yang digunakan adalah http://api.server.local:8888/api/nilai , dan jika hanya akan mengambil data nilai siswa tertentu maka gunakan URI http://api.server.local:8888/api/nilai/1. jika kita gambarkan dengan langkah-langkah metode get web service secara sederhana bisa seperti berikut:

Client melakukan HTTP request dengan metode GET dan menggunakan id_siswa sebagai parameter yang dikirimkan
Client menyiapkan tipe representasi pada accept request header.
Web server menerima dan menerjemahkan GET request menjadi aksi retrieve. Setelah ini web server akan meneruskan aksi ke RESTful framework untuk menangani request yang datang. RESTful framework tidak secara otomatis mengambil resource yang diminta karena fungsi dari framework tersebut adalah untuk implementasi REST constraint sedangkan logika bisnis dan lain lain akan ditangani logika si pembuat layanan Webservices
logika code pada server akan mencari resource yang di request dengan mengambil data dari database, file atau pun memanggil web service yang lain. Setelah resource ditemukan, resource tersebut akan di convert menjadi representasi yang direquest client, dalam kasus ini adalah XML Dengan representasi yang telah diubah menjadi XML server mengirim HTTP response beserta XML nya

Metode POST

Untuk melakukan aksi create, digunakan metode HTTP POST, sebagai ilustrasi URI http://api.server.local:8888/api/nilai/ akan kembali digunakan. Dengan asumsi data nilai siswa belum terdapat dalam list siswa maka representasi XML dari nilai soswa akan tampil sebagai berikut:

Code:
<item>
<id_siswa></id_siswa>
<nama_siswa>Yondaime Hokage</nama_siswa>
<n_bahasa>90.90</n_bahasa>
<n_matematika>78.90<n_matematika>
<n_binggris>90.95</n_binggris>
</item>

Terdapat sedikit perbedaan dengan representasi nilai siswa pada metode GET sebelumnya. Pada representasi diatas tag <id_siswa> kosong, karena data nilai untuk siswa Dengan nama Yondaime Hokage belum ada di list dan nilai untuk tag <id_siswa> digenerate pada saat proses create. jika kita sekenariokan dari metode Create bisa menjadi seperti berikut.

Client melakukan HTTP request dengan metode POST
POST request membawa representasi xml dari nilai siswa yang akan dicreate.
Web server menerima request dan framework memprosesnya, code logik menyimpan data dalam storage yang digunakan
Setelah proses penyimpanan selesai, respose dikirim kembali ke client.

Metode PUT

Untuk update data resource, pertama resource yang terdapat dalam storage harus diambil lalu update nilai yang akan diubah lalu kirim put request serta xml request yang merupakan representasi data yang baru. Proses metode PUT ini seperti metode get dan post dilakukan secara berurutan, hanya saja metode post digantikan metode PUT.

Metode DELETE

Untuk menghapus resource, URI yang sama masih digunakan seperti tiga metode sebelumnya. Diasumsikan resource nilai siswa akan dihapus maka kirim DELETE request melalui URI http://api.server.local:8888/api/nilai/.

Rest Security

Pada web service, hal yang menjadi fokus dari sisi keamanan adalah kontrol terhadap resource. Meskipun pada umumnya web service dapat diakses oleh publik, pengaksessan data dan traffic harus tetap dikontrol. Sebagai contoh google translate API membatasi jumlah kata yang diterjemahkan per hari untuk setiap user yang telah terregistrasi dan telah membayar untuk menggunakan google translate API. Terdapat 2 cara yang umum digunakan untuk RESTful web service yaitu custom token authentication dan HTTP basic authentication

Custom Token Authentication

Secara sederhana cara ini diimpelemntasikan dengan men-generate token yang unik untuk setiap user yang telah terdaftar lalu user tersebut mengirimkan token yang telah di-generate pada setiap request web service. Cara ini relatif mudah diimplementasi, biasanya diterapkan pada proses registrasi user. Setiap ada registrasi user baru, user tersebut diberikan token yang unik. Dan karena setiap request token tersebut ikut dikirimkan maka akses terhadap resource terkontrol dengan baik.

Token untuk proses authentication ini dikirimkan untuk setiap request dengan 2 macam cara, menjadi bagian dari URI atau ditambahkan pada HTTP request header. Berikut adalah contoh yang menjadi bagian URI

Code:
GET https://www.googleapis.com/language/translate/v2?key=INSE RT-YOUR-KEY&source=en&target=de&q=Hello%20world

URI diatas adalah web service untuk google translate, dimana dalam URI tersebut terdapat parameter key. Parameter key tersebut adalah token yang unik terhadap setiap user. Untuk semua service yang disediakan parameter key tersebut menjadi hal yang wajib dalam URI yang digunakan.

Secara garis besar cara ini dapat memberikan developer kontrol terhadap web service yang disediakan. Sebagain contoh google translate memberikan limit 2 juta karakter per hari untuk regular user yang sudah terigistrasi, jika limit tersebut sudah terlampaui maka akses terhadap web service ini untuk user tersebut dapat ditutup sampai hari berikutnya. Namun cara ini sangat beresiko karena key dikirim setiap request dan bisa saja ada pihak lain yang mencuri key tersebut dan menggunakannya sendiri dan penyedia web service pun tidak bisa mengetahui yang mana yang memang memiliki otorisasi.

HTTP basic authentication

Cara ini diimplementasikan dengan mengirimkan teks Base64 encoded username dan password pada HTTP header Authorization. Username dan password tersebut selalu dikirimkan untuk setiap HTTP request untuk proses authorization, Client melakukan request terhadap resource /listmhs namun karena resource ini diproteksi dengan HTTP basic authentication dan didalam request client tidak terdapat authentication credential yang diperlukan maka server memberikan HTTP response 401, client yang menerima response tersebut akan melakukan aksi membuat request baru dengan menyertakan credential yang diperlukan untuk proses authentication dan dikirimkan ke URI yang sama, jika credential yang disediakan benar maka server akan memberikan response yang diminta


Jika melihat proses yang terjadi untuk cara ini, client request dapat dibuat oleh aplikasi apapun yang memiliki koneksi HTTP, dan jika yang digunakan adalah web browser, ada satu hal yang harus diperhatikan, yaitu cache. Jika credential yang diperlukan disimpan dalam cache maka user tidak perlu selalu menyertakan credential pada setiap request. Namun karena disimpan di cache web browser maka untuk menghapusnya perlu dilakukan secara manual. Jika tidak dihapus bisa terjadi penyalahgunaan oleh pihak lain. Selain itu penggunaan basic authentication ini masih memiliki resiko yang cukup tinggi karena username dan password hanya diencode menggunakan Base64 encoding yang cukup mudah dipecahkan, walaupun memang penggunaan Base64 ditujukan untuk penyeragaman karakter yang diencode untuk ditransfer melalui HTTP. Namun resiko ini dapat sedikit dikurangi dengan menggunakan HTTPS (SSL) bukan HTTP

Client request yang dibuat melalui web browser akan memiliki urutan proses seperti sequence diagram yang ditampilkan sebelumnya. Request dikirim server mengirim response 401 dan web browser akan menampilkan form untuk mengisikan credential yang diminta. Web browser secara otomatis akan mengirimkan kembali request ke URI yang sama

Cara lain adalah dengan langsung menyertakan credential pada request pertama. Cara ini dapat dilakukan dengan menambahkan credential pada saat request pertama kali dilakukan. Tentu saja hal ini perlu ditambahkan di code yang akan melakukan request. Berikut adalah contoh source code java untuk menambahkan credential pada HTTP header dengan menggunakan Commons HTTP client library.

Code:
HttpClient client = new HttpClient();
client.getState()
.setCredentials(
new AuthScope("api.server.local",8888,"basic"),
new UsernamePasswordCredentials("username","password")
);
GetMethodget = new GetMethod("http://api.server.local:8888/api/nilai/");
get.setDoAuthentication(true); client.executeMethod(get);

Method setCredentials() menyertakan credential pada HTTP Header dan setelah itu melakukan get method. Dengan cara ini, tidak perlu menunggu response 401 dari server karena credential telah disertakan sejak request pertama. Jika credential sesuai maka response yang diminta akan diberikan oleh server. Untuk metode request yang lain pun (POST,PUT,DELETE) dapat menggunakan cara yang sama.

huff…… panjang juga teorinya yak    ,

Codeigniter Sebagai Restfull Webservices

Setelah membaca panjang lebar teori diatas pastinya teman-teman sudah sedikit mengerti tentang landasan dasar dan cara penggunaan secara singkat tentang Webservies, pada bagian ini kita akan mencoba membangun Layanan Webservices Sederhana yang menyediakan informasi tentang nilai siswa seperti yang telah kita bahas sebelumya diatas tadi, pada bagian ini sebaiknya teman-teman sudah sedikit paham tentang penginstalan PHP framewok Codeigniter, karena core yang kita gunakan adalah Framework Codeigniter, oke untuk kebutuhan pertama kita download dulu Codeigniter, Kemudian install pada root direktori webserver masing-masing, struktur folder dari Codeigniter sendiri seperti berikut

kemudian kita membutuhkan sebuah library pendukung lainya, dalam tulisan ini saya menggunakan CodeIgniter Rest Controller yang dikembangkan oleh Phil Sturgeon, Chris Kacerguis, untuk mendownloadnya bisa langsung ke https://github.com/philsturgeon/codeigniter-restserver, setalah di dowload, extract hasil download, kemudian copy file application/libraries/REST_Controller.php dan application/libraries/Format.php ke folder Codeigniter pada Folder Codeigniter yang sebelumnya kita install, lakukan hal yang sama untuk file /application/config/rest.php sehingga struktur file pada Codeigniter yang baru seperti berikut


hal-hal yang perlu kita perhatikan adalah, beberapa konfgurasi dasar seperti berikut (Sesuaikan dengan kebutuhan)

PHP Code:
#Location: ./system/application/config/rest.php$config['rest_keys_table'] = 'keys';$config['rest_enable_keys'] = TRUE;#Location: ./application/config/config.php$root "http://".$_SERVER['HTTP_HOST'];$root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);$config['base_url']    = "$root";$config['encryption_key'] = 'inikeyrahasia';#Location: ./application/config/autoload.php$autoload['libraries'] = array('database');$autoload['helper'] = array('url');#Location: ./application/config/database.php$db['default']['hostname'] = 'localhost';$db['default']['username'] = 'root';$db['default']['password'] = 'root';$db['default']['database'] = 'api_server';$db['default']['dbdriver'] = 'mysql'

setelah kita konfigurasi, kita buat dulu database untuk kebutuhan penyimpanan data nantinya, karena Webservices sederhana kita akan memberikan informasi tentang nilai siswa, dan setiap client nantinya akan diberikan API Key sebagai kunci agar bisa mendapatkan informasi, untuk itu kita butuh 2 buat tabel dengan nama keys dan siswa

Code:
CREATE TABLE `keys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key` varchar(40) NOT NULL,
`level` int(2) NOT NULL,
`ignore_limits` tinyint(1) NOT NULL DEFAULT '0',
`is_private_key` tinyint(1) NOT NULL DEFAULT '0',
`ip_addresses` TEXT NULL DEFAULT NULL,
`date_created` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Code:
CREATE TABLE `siswa` (
`id_siswa` int(11) unsigned NOT NULL AUTO_INCREMENT,
`nama_siswa` varchar(32) DEFAULT NULL,
`n_bahasa` decimal(11,2) DEFAULT NULL,
`n_matematika` decimal(11,2) DEFAULT NULL,
`n_binggris` decimal(11,2) DEFAULT NULL,
PRIMARY KEY (`id_siswa`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

kemudian kita coba jalankan, untuk memastikan semua berjalan dengan lancar, jika tidak ada masalah maka tampilan awal codeigniter akan tetap seperti semula, alias tidak ada yang berubah.


tahap selanjutnya kita akan mendesain sebuah logic untuk memproses setiap request yang akan diproses, pada tingkatan ini, semua client harus menggunakan API Key untuk dapat melakuakn request dan menerima respon dari server, kita bisa analogikan prosesnya seperti berikut ini

client mengirimkan request – Server melakukan proses pengecekan terhadap API KEY dari Client – jika API Key Benar maka proses akan dilanjutkan – Jika API KEY tidak benar maka server akan memberikan pesan bahwa API KEY tidak valid, mari kita lihat dulu fungsi-fungsi yang nantinya kita butuhkan

PHP Code:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');/**
 * API Controller
 *
 * Contoh pengunaan fungsi dalam Restfull Web Services
 *
 * @package        CodeIgniter
 * @subpackage    Rest Server
 * @category    Controller
 * @author        Khairu Aqsara
 * @link        http://khairu.my.id
*/
require APPPATH.'/libraries/REST_Controller.php';
class 
Api extends REST_Controller{
    
# fungsi untuk melihat nilai siswa
    
function nilai_get($id_siswa=null){}
    
## fungsi untuk simpan nilai siswa
    
function nilai_post(){}

pada fungsi diatas terdapat 2 buah fungsi utama, yang pertama adalah fungsi untuk menampilkan nilai siswa, dan fungsi ke-dua untuk menambhkan nilai siswa, yang perlu diperhatikan adalah penamaan fungsi pada barisan code diatas, RestFull Webservices akan memproses semua request dengan metode-metode yang sudah dijelaskan sebelumnya, jika kita perhatikan nama fungsi di atas terlihat nilai_get() _get() diatas menunjukan jika fungsi tersebut direquest menggunakan metode _GET, sedangkan pada fungsi berikutnya dipanggil dengan menggunakan metode _POST, jika kita terjemahkan dalam bentuk request mungkin sederhananya akan menjadi seperti berikut

Code:
GET http://api.server.local:8888/api/nilai
GET http://api.server.local:8888/api/nilai/1
POST http://api.server.local:8888/api/nilai

sekarang kita akan mencoba menambahkan beberapa baris code pada kedua fungsi diatas sesuai dengan kebutuhan kita,berikut code untuk fungsi nilai_get()

PHP Code:
# fungsi untuk melihat nilai siswafunction nilai_get($id_siswa=null){
    if(
$id_siswa!=null){
        
$nilai $this->db->get('siswa', array('id_siswa'=>$id_siswa));
        if(
$nilai->num_rows() == 1){
            
$respon = array(
                    
'status'=>true,
                    
'id_siswa'=>$nilai->row()->id_siswa,
                    
'nama_siswa'=>$nilai->row()->nama_siswa,
                    
'n_bahasa'=>$nilai->row()->n_bahasa,
                    
'n_matematika'=>$nilai->row()->n_matematika,
                    
'n_binggris'=>$nilai->row()->n_binggris
                
);
            
$this->response($respon200);
        }else{
            
$this->response(array('status'=>false,'msg'=>'Data tidak ditemukan'), 500);
        }
    }else{
        
$nilai $this->db->get('siswa');
        if(
$nilai->num_rows() > 0){
            
$respon = array(
                    
'status'=>true,
                    
'data_nilai_siswa'=>$nilai->result_array(),
                );
            
$this->response($respon200);
        }else{
            
$this->response(array('status'=>false,'msg'=>'Data tidak ditemukan'), 500);
        }
    }

Kemudian pada fungsi berikutnya

PHP Code:
# fungsi untuk simpan nilai siswafunction nilai_post(){
    
$data = array(
            
'nama_siswa'=>$this->post('nama_siswa'),
            
'n_bahasa'=>$this->post('n_bahasa'),
            
'n_matematika'=>$this->post('n_matematika'),
            
'n_binggris'=>$this->post('n_binggris')
        );
    if(
$this->db->insert('siswa'$data)){
        
$this->response(array('status'=>true,'data'=>$data,'msg'=>'Data Berhasil disimpan'), 200);
    }else{
        
$this->response(array('status'=>false,'msg'=>'Data tidak berhasil disimpan!!'), 500);
    }

untuk mencoba hasil dari program kita, kita bisa menggunakan Rest Client, disini saya menggunakan Rest Client untuk Add Ons Mozila Firefox (http://www.restclient.net/), seperti dijelaskan diatas, client akan membutuhkan API Key sebagai kunci untuk bisa mendapatkan data dari server, jika request tidak menyertakan API KEY maka server akan memberikan respon bahwa API KEY tidak valid, seperti gambar berikut

untuk itu kita akan menambahkan X-API-KEY pada HTTP header, untuk value dari API KEY silahkan diambil dari tabel Key yang telah kita buat sebelumnya, pada contoh ini saya mengunakan jenis hash sha1 dengan panjang 40 karakter bentuk hash, contohnya seperti gambar berikut

setelah API Key di tambahkan pada bagian Header HTTP, kita ulangi proses request, maka hasilnya akan muncul dalam bentuk XML, seperti gambar berikut


data diatas diambil dari database yang telah kita buat sebelumnya, begitu juga dengan metode pengiriman data menggunakan POST, setiap request harus menyertakan API KEY, jika kita menggunakan RestClient kita juga harus menentukan Content Type agar server memeriksa request sebagai request dari sebuah form, seerti berikut


kemudian kita tambahkan value yang akan dikirimkan keserver dalam mode http query seperti berikut

Code:
nama_siswa=Yondaime Hokage&n_bahasa=90&n_matematika=80&n_binggris=100

jika kita kirimkan request ke server maka kita akan mendapatkan respon seperti berikut


sekian dulu dari saya, mudah-mudahan bermanfaat, apa yang ada dalam tulisan ini banyak yang bisa kita terapkan, tergantung kebutuhan dan kretifitas kita. 

Sumber: http://devilzc0de.org/forum/printthread.php?tid=22549

Related Articles

0 komentar :

Post a Comment