Layanan Web adalah sistem software yang didesain untuk mendukung interaksi interoperable mesin-ke-mesin melalui sebuah jaringan. Dalam konteks aplikasi Web, ia biasanya merujuk ke satu set API yang dapat diakses melalui Internet dan menjalankan layanan yang diminta pada hosting sitem jarak jauh secara jarak jauh. Sebagai contoh, Klien berbasis-Flex dapat memanggil fungsi yang diimplementasikan pada sisi server yang menjalankan aplikasi berbasis-PHP. Layanan Web bergantung pada SOAP sebagai lapisan dasar tumpukan protokol komunikasinya.
Yii menyediakan CWebService dan CWebServiceAction untuk menyederhanakan pekerjaan implementasi layanan Web dalam aplikasi Web. The APIs are grouped into classes, called service providers. Yii will generate for each class a WSDL specification which describes what APIs are available and how they should be invoked by client. When an API is invoked by a client, Yii will instantiate the corresponding service provider and call the requested API to fulfill the request.
Note: CWebService relies on the PHP SOAP extension. Make sure you have enabled it before trying the examples displayed in this section.
Seperti sudah disebutkan di atas, penyedia layanan adalah kelas yang mendefinisikan metode yang dapat secara remote (jarak jauh) dipanggil. Yii bergantung pada komentar dokumen dan kelas refleksi dalam mengidentifikasi metode mana yang bisa dipanggil secara remote dan parameter apa serta nilai balik.
Mari kita mulai dengan kutipan layanan stok. Layanan ini mengijinkan klien
untuk meminta kutipan stok yang sudah ditetapkan. Kita mendefinisikan penydia
layanan sebagai berikut. Catatan bahwa kita mendefinisikan kelas penyedia
StockController
dengan memperluas CController. Ini tidak diperlukan. Kami akan
segera menjelaskan mengapa kita melakukannya.
class StockController extends CController
{
/**
* @param string the symbol of the stock
* @return float the stock price
* @soap
*/
public function getPrice($symbol)
{
$prices=array('IBM'=>100, 'GOOGLE'=>350);
return isset($prices[$symbol])?$prices[$symbol]:0;
//...return stock price for $symbol
}
}
Dalam contoh di atas, kita mendeklarasikan metode getPrice
menjadi API layanan Web,
menandainya dengan tag @soap
dalam komentar dokumen. Kita bergantung pada komentar dokumen
untuk menetapkan jenis data parameter input dan nilai hasil.
API tambahan dapat dideklarasikan dengan cara yang sama.
Setelah mendefinisikan penyedia layanan, kita harus membuatnya tersedia bagi
klien. Sebenarnya kita ingin membuat aksi kontroler untuk mengekspos layanan.
Ini bisa dilakukan secara mudah dengan mendeklarasikan aksi CWebServiceAction dalam
kelas kontroler. Dalam contoh kita, kita akan memasukkan
StockController
.
class StockController extends CController
{
public function actions()
{
return array(
'quote'=>array(
'class'=>'CWebServiceAction',
),
);
}
/**
* @param string the symbol of the stock
* @return float the stock price
* @soap
*/
public function getPrice($symbol)
{
//...kembalikan harga stok untuk simbol $symbol
}
}
Selesai, cuma itu yang kita perlukan dalam membuat layanan Web! Jika kita mencoba mengakses
aksi dengan URL http://hostname/path/to/index.php?r=stock/quote
, kita akan
melihat banyak konten XML yang sebenarnya WSDL bagi layanan Web yang kita
definisikan.
Tip: Distandarkan, CWebServiceAction menganggap kontroler saat ini adalah penyedia layanan. Itulah mengapa kita mendefinisikan metode
getPrice
di dalam kelasStockController
.
Untuk melengkapi contoh, mari kita buat klien untuk menerima layanan Web
yang baru kita buat. Contoh klien ditulis dalam PHP, tapi ia dapat dibuat dalam
bahasa lainnya seperti Java
, C#
, Flex
, dll.
$client=new SoapClient('http://hostname/path/to/index.php?r=stock/quote');
echo $client->getPrice('GOOGLE');
Jalankan naskah di atas baik dalam Web ataupun mode konsol, dan kita seharusnya melihat 350
yang merupakan harga untuk GOOGLE
.
Ketika mendeklarasikan metode kelas dan properti yang akan diakses secara remote, kita harus menetapkan tipe data atas parameter input dan output. Tipe data primitif berikut bisa dipakai:
xsd:string
;xsd:int
;xsd:float
;xsd:boolean
;xsd:date
;xsd:time
;xsd:dateTime
;xsd:string
;xsd:struct
;xsd:anyType
.Jika tipe bukan salah satupun dari tipe primitif di atas, ia dianggap sebagai
tipe composite yang terdiri dari properti. Tipe composite disajikan dalam
batasan kelas, dan propertinya adalah variabel anggota public kelas yang ditandai
dengan @soap
dalam komentar dokumennya.
Kita juga bisa menggunakan tipe array dengan menambahkan []
di akhir tipe primitif atau
tipe composite. Ini akan menetapkan sebuah array pada tipe yang sudah ditetapkan tersebut.
Di bawah ini adalah contoh mendefinisikan Web API getPosts
Web API yang menghasilkan array
obyek Post
.
class PostController extends CController
{
/**
* @return Post[] a list of posts
* @soap
*/
public function getPosts()
{
return Post::model()->findAll();
}
}
class Post extends CActiveRecord
{
/**
* @var integer post ID
* @soap
*/
public $id;
/**
* @var string post title
* @soap
*/
public $title;
}
Agar bisa menerima parameter tipe composite dari klien, aplikasi harus mendeklarasikan pemetaan dari tipe WSDL ke kelas PHP terkait. Ini dilakukan dengan mengkonfigurasi properti classMap pada CWebServiceAction.
class PostController extends CController
{
public function actions()
{
return array(
'service'=>array(
'class'=>'CWebServiceAction',
'classMap'=>array(
'Post'=>'Post', // atau cukup 'Post'
),
),
);
}
......
}
Dengan mengimplementasi antar muka IWebServiceProvider, penyedia layanan bisa mengintersepsi penyertaan metode jarak jauh. Dalam IWebServiceProvider::beforeWebMethod, penyedia bisa mengambil turunan CWebService saat ini dan mendapatkan nama metode yang saat ini sedang dipakai via CWebService::methodName. Ini dapat menghasilkan false jika metode remote seharusnya tidak dipanggil untuk beberapa alasan (misalnya akses tidak diotorisasi).
Signup or Login in order to comment.