Layanan SOAP

SOAP membentuk lapisan dasar dari tumpukan layanan Web. Ia menyediakan cara yang rapi agar aplikasi PHP saling berkomunikasi atau dengan aplikasi yang ditulis dalam bahasa lain. PRADO menyediakan TSoapService yang membuat pengembagan aplikasi server SOAP menjadi tugas yang sangat mudah.

Untuk menggunakan TSoapService, konfigurasi itu dalam spesifikasi aplikasi seperti berikut:

Contoh menetapkan penyedia layanan SOAP bernama stockquote yang mengimplementasikan metode SOAP getPrice dalam kelas penyedia StockQuote,

class StockQuote { /** * @param string $symbol the symbol of the stock * @return float the stock price * @soapmethod */ public function getPrice($symbol) { ....return stock price for $symbol } }
Catatan: TSoapService didasarkan pada ekstensi SOAP PHP dan memerlukan ekstensi terinstalasi.

Dengan kode sederhana di atas, kita sudah menyelesaikan layanan SOAP sederhana yang membolehkan aplikasi lain untuk meng-query harga dari stok tertentu. Sebagai contoh, umumnya klien SOAP bisa ditulis seperti berikut guna mendapatkan harga stok atas IBM,

$client=new SoapClient('http://path/to/index.php?soap=stockquote.wsdl'); echo $client->getPrice('IBM');

Perhatikan URL yang digunakan untuk membentuk SoapClient (kelas disediakan oleh ekstensi SOAP PHP). Ini adalah URL untuk WSDL yang menjelaskan protokol komunikasi untuk layanan SOAP yang baru kita implementasikan. WSDL sering kali terlalu rumit untuk ditulis secara manual. Kebetulan, TSoapService bisa membuat ini bagi kita menggunakan generator WSDL. Secara umum, URL untuk membuat WSDL secara otomatis dalam PRADO mempunyai format berikut:

http://path/to/index.php?SoapServiceID=SoapProviderID.wsdl

Agar generator WSDL membuat WSDL untuk layanan SOAP, kelas penyedia perlu untuk mengikuti sintaks tertentu. Dalam keadaan tertentu, untuk metode yang akan diperlihatkan sebagai metode SOAP, kata kunci @soapmethod harus muncul dalam komentar phpdoc terhadap metode dengan baris berikut yang menetapkan parameter metode dan nilai hasil:

Parameter yang benar dan tipe hasil termasuk: string, int, boolean, float, array, mixed, dll. Anda dapat juga menetapkan nama kelas sebagai tipe, yang menterjemahkan ke dalam tipe SOAP kompleks. Sebagai contoh, untuk tipe kompleks Contact

/** * Memperluas TComponent untuk menyediakan metode pengambil/penentu properti */ class Contact { /** * @var string $name * @soapproperty */ public $name; /** * @var Address $address * @soapproperty */ private $_address; public function setAddress($value) { $this->_address=$value; } public function getAddress() { if($this->_address===null) $this->_address=new Address; return $this->_address; } } class Address{ /** * @var string $city * @soapproperty */ public $city; } class ContactManager { /** * @return Contact[] an array of contacts * @soapmethod */ function getAllContacts() { return array(new Contact); } /** * @return Contact one contact * @soapmethod */ function getContact($name) { return new Contact; } }

Untuk obyek soap kompleks, properti obyek ditetapkan dengan kata kunci @soapproperty dalam phpdocs. Selanjutnya, nama tipe properti harus ditetapkan sebagai @var type $name di mana type adalah tipe apapun yang benar seperti telah disebutkan sebelumnya dan $name akan mendefinisikan properti name (catatan bahwa jika kelas Anda adalah TComponent, Anda bisa menyediakan properti pengambil/penentu).

Sebuah array dari obyek yang kompleks juga bisa dihasilkan dengan menambahkan pasangan yang dilindungi kurung kotak setelah nama tipe. Sebagai contoh, untuk menghasilkan array dari tipe Contact, kita mendefinisikan @return Contact[] ....

Tip: Piranti sangat berguna untuk menguji layanan web Anda adalah piranti bebas WebServiceStudio 2.0. Ia bisa memanggil webmethods secara interaktif. Pengguna dapat menyediakan sebuah titik akhir WSDL. Pada saat mengklik tombol Get piranti mengambil WSDL, membuat proxy .NET dari WSDL dan menampilkan daftar metode yang tersedia. Pengguna bisa memilih setiap metode dan menyediakan parameter input yang diplerukan. Piranti membutuhkan MS .NET runtime terinstalasi.

Piranti semacam itu tersedia untuk Mac OS X Tiger dari http://www.ditchnet.org/soapclient/

TSoapService bisa dikonfigurasi dan dikustomisasi dalam beberapa cara. Dalam contoh di atas, elemen <soap> sebenarnya menetapkan sebuah layanan SOAP menggunakan implementasi standar TSoapServer. Atribut dalam <soap> dikirimkan ke TSoapServer sebagai nilai properti awalnya. Sebagai contoh, atribut provider menginisialisasi properti Provider dari TSoapServer. Dengan menyetel SessionPersistent menjadi true dalam elemen <soap>, turunan penyedia akan sama di dalam sesi pengguna. Anda bisa mengembangkan kelas server SOAP sendiri dan menggunakannya dengan menetapkan atribut class dari <soap>.

Standarnya, server SOAP PHP akan membuat obyek dari tipe StdClass ketika obyek diterima dari klien. Server soap bisa dikonfigurasi untuk secara otomatis membuat obyek dari obyek tipe tertentu diterima sebagai parameter metode. Sebagai contoh, jika kita mempunyai sebuah metode Soap yang menerima obyek Contact sebagai parameter. /** * @param Contact $contact * @return boolean true if saved, false otherwise * @soapmethod */ function save(Contact $contact) { return true } Untuk melakukan ini, kita perlu menyetel properti ClassMaps dari TSoapServer dalam tag <soap> sebagai nama kelas string dipisahkan koma yang kita inginkan secara otomatis dikonversi.