[Yii Framework] Membuat Web Service SOAP(2)
June 29, 2011 11 Comments
Semua sistem yang diciptakan di dunia ini pasti punya keterkaitan dengan data. Sebelumnya saya sudah membahas teknik membuat web service SOAP disini, silahkan anda pelajari postingan sebelumnya jika anda belum paham cara membuat service sederhana pada Yii Framework. Bahasan sebelumnya adalah bahasan untuk membuat SOAP service, hanya saja pada bahasan tersebut, kita belum terintegrasi dengan database. Kali ini saya akan bahas membuat SOAP service yang telah terintegrasi dengan database, semoga membantu :D…
Pertama, pada kasus ini saya punya sebuah table di database saya bernama tabel “satu”yang memiliki attribut berikut:
Ada dua attribut “satusatu” dan “satudua”, dan sudah saya isi dengan 2 row data…
Silahkan anda buat aplikasi Yii anda dan anda generate model dari tabel “satu” dan jangan lupa generate operasi “CRUD” nya. Setelah itu, silahkan buka controller dari tabel “satu” tersebut di folder protected/controllers/satu.php. Buat sebuah function actions yang akan menurunkan kelas Web Service seperti berikut:
public function actions() { return array( 'quote'=>array( 'class'=>'CWebServiceAction', 'classMap'=>array( 'Satu'=>'Satu', ) ), ); }
Penjelasan : Seperti yang saya jelaskan sebelumnya bahwa fungsi ini digunakan untuk menurunkan kelas “CWebServiceAction” agar kita dapat menggunakan class web service yang sudah tersedia dari Yii Framework. Hanya saja disana terdapat tambahan “classMap” dimana isinya adalah “Satu”. Code tersebut digunakan untuk mendefinisikan model “Satu” agar dapat dikenali oleh web service. Bingung ??? Okeh-okeh, saya akan kasih contoh. Pada postingan kemarin kita mengembalikan nilai “String” pada service yang kita sediakan. Nah, tipe string itu sendiri sudah di kenali langsung oleh PHP nya. Tetapi pada kasus ini, kita ingin mengirimkan nilai model “Satu” yang dimana model “Satu” itu sendiri tidaklah dikenali. Maka dari itu code tersebut kita buat agar service kita mengenali model “Satu” tersebut..
Jangan lupa definisikan function actions di atas di “function accessRule()”, sama kayak postingan sebelumnya yak ..
Setelah itu, mari kita buat sebuah fungsi service nya. Pada kasus ini, saya akan membuat sebuah service yang hasilnya akan mengirimkan semua nilai yang ada pada tabel “Satu”. Berikut code nya:
/** *@return Satu[] *@soap */ public function getSatus() { return Satu::model()->findAll(); }
Penjelasan : Disana terdapat comment “@return Satu[]”, ingat pembahasan sebelumnya, itu bukanlah comment biasa. Comment itu adalah yang memberitahukan bahwa service kita akan mengirimkan sekumpulan nilai(array) “Satu”. Comment itu juga(@soap) yang menjelaskan bahwa fungsi tersebut adalah sebuah service. Di dalam fungsi tersebut ada code “return Satu::model()->findAll();”, itu adalah code yang akan mengembalikan semua nilai yang ada pada tabel “Satu”.
Setelah itu bukalah model “Satu” di protected/models/Satu.php. Sisipkan code berikut:
/** * @var string name * @soap */ public $satusatu; /** * @var string phone number * @soap */ public $satudua;
Penjelasan : Code tersebut untuk mendefinisikan variabel apa saja yang diizinkan untuk dikirimkan via service. Jika anda tidak mengizinkan orang lain mengakses variabel “$satudua”, maka anda cukup “public $satudua” beserta comment yang dimilikinya..
Selesai, silahkan anda coba akses http://localhost/namaProject/index.php?r=satu/quote , dan lihat apakah tampil tag-tag XML disana. Bila ya, berarti anda sudah sukses membuat service tersebut…
Untuk membuktikan apakah service yang kita buat benar-benar sudah berjalan atau belum, mari kita sekalian membuat client aplikasi yang mengakses service kita tersebut. Sama seperti bahasan sebelumnya, saya akan buat client aplikasi dengan 2 bahasa pemrograman. PHP untuk web application dan C# untuk desktop application.
1. PHP(non Yii Framework)
Buatlah sebuah file .php, lalu masukkan code berikut:
<?php ini_set( 'soap.wsdl_cache_enable' , 0 ); ini_set( 'soap.wsdl_cache_ttl' , 0 ); $client=new SoapClient('http://localhost/namaProject/index.php?r=satu/quote'); function object_to_array($Class) { $Class = (array)$Class; foreach($Class as $key => $value) { if(is_object($value)&&get_class($value)==='stdClass') { $Class[$key] = self::object_to_array($value); } } return $Class; } function printListObject($namaObject) { foreach($namaObject as $v) { echo '<br/>'; $aku= object_to_array($v); foreach($aku as $k=>$valu) { echo $valu; echo '<br/>'; } } } printListObject($client->getSatus()); ?>
Penjelasan :
Pada code di atas kita memanggil service yang kita mau pakai dengan cara memasukkan mendefinisikan URL dari service tersebut. Karena service kali ini akan mengembalikan sekumpulan nial “Satu” dan PHP sendiri tidak mengenali model “Satu” itu sendiri di program ini(yang kenal “Satu” hanya aplikasi server, karena disana didefinisikan model “Satu” ), maka kita harus membuat sebuah fungsi yang dapat mengkonversi nilai satu tersebut menjadi nilai. Nah, fungsi “Object_to_array” disana adalah fungsi yang digunakan untuk mendapatkan nilai-nilai yang ada pada tabel “Satu”, dan fungsi “printListObject” berguna untuk mencetak nilai-nilai yang ada pada tabel “Satu” setelah tabel itu sendiri di uraikan oleh fungsi “Object_to_array”. Setelah, itu simpan file .php tersebut, lalu jalankan lewat localhost anda… Hasilnya seperti berikut:
2. C#(Visual Studio Express Edition 2008)
Buka visual studio anda, buat sebuah project “Windows Form Application”. Sama seperti bahasan kemarin, tambahkan sebuah service reference yang URL nya merupakan URL service kita tadi.
Berbeda dengan saat menggunakan PHP, dengan C#, visual studio akan secara otomatis menggenerate model “Satu” itu sendiri . Sehingga kita tidak perlu membuat sebuah funsi untuk memecah model “Satu” itu sendiri. Masukkan sebuah control “dataGridView” dan sebuah “Button” pada form anda. Buatlah sebuah event untuk “Button” click, lalu masukkan code berikut di dalamnya:
private void button1_Click(object sender, EventArgs e) { ServiceReference1.SatuControllerPortTypeClient itu = new WindowsFormsApplication1.ServiceReference1.SatuControllerPortTypeClient(); dataGridView1.DataSource = itu.getSatus(); }
Penjelasan : Baris pertama maksudnya adalah kita mendefinisikan class yang kita dapat dari service tersebut. Baris kedua adalah kita ingin memasukkan semua nilai “Satu” ke dalam “dataGridView”.
Sekarang jalankan program anda, lalu tekan tombol “Button”, maka hasilnya akan seperti berikut:
Seperti itulah caranya :D…
Selesai,… Selamat mencoba…
Semoga membantu :D…
Komentar