SERVICE PROVIDER dan WSDL
Pada panduan ini, akan disimulasikan pemisahan dan komunikasi antara tier presentasi dan tier logika bisnis (seperti pada gambar arsitektur aplikasi 3-tier berikut). Kedua tier tersebut berjalan di satu mesin komputer. Basis data tidak dibahas.
Persiapan
XAMPP Dowload dari http://www.apachefriends.org/en/xampp.html
Install XAMPP. Pada panduan ini di C:\xampp (Windows) Jalankan web server Apache
Buat subfolder berikut pada folder C:\xampp\htdocs
C:\xampp\htdocs\tier1 : tier presentasi (service requester, client) C:\xampp\htdocs\tier2 : tier logika bisnis (service provider, server)
NuSOAP
Download dari http://sourceforge.net/projects/nusoap/
Extract nusoap-0.9.5.zip
Kopi folder lib hasil ekstraksi ke folder tier1 dan tier2 tersebut di atas.
Basisdata Tier 1
Presentasi
Tier 2 Logika bisnis
Web server Apache
Pengembangan server
Fokus pengembangan server pada panduan ini adalah untuk memfasilitasi mempelajari WSDL , bukan detil pemrograman dengan PHP dan NuSOAP.
Tulis program berikut, simpan sebagai file hello.php di folder tier2 (server)
<?php
require_once('lib/nusoap.php');
//buat soap server
$server = new nusoap_server();
//konfigurasi WSDL
$namespace = 'http://teduh.dirgahayu.com';
$server->configureWSDL('HelloWSDL', $namespace); //nama service
$server->wsdl->schemaTargetNamespace = $namespace;
//fungsi tanpa parameter function HelloWorld() {
return 'Hello, World!'; }
//daftarkan fungsi HelloWorld sebagai operasi pada service
$server->register('HelloWorld', //nama operasi
array('null' => 'xsd:any'), //parameter input
array('return' => 'xsd:string'), //parameter output
$namespace, //namespace 'uri:hello.php#HelloWorld' //soapaction
);
//penanganan request
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
WSDL
Buka alamat localhost/tier2/hello.php pada browser.
NuSOAP menggunakan WSDL versi 1.1 (http://www.w3.org/TR/wsdl). Struktur WSDL ini terdiri dari lima bagian utama, yaitu:
Types
Cari elemen portType di bagian tengah dokumen WSDL.
PortType merupakan kumpulan operasi (operation) yang tersedia pada server. PortType mempunyai nama. Dengan NuSOAP, nama portType diberikan secara otomatis dengan merujuk pada nama service.
<portType name="HelloWSDLPortType"> <operation name="HelloWorld">
<input message="tns:HelloWorldRequest"/> <output message="tns:HelloWorldResponse"/> </operation>
</portType>
Tiap operasi mempunyai nama sesuai yang didaftarkan pada program PHP. Untuk menggunakan operasi, diperlukan pesan (message), yakni input message dan/atau output message yang kemudian didefinisikan di bagian Message.
Message
Lihat elemen message sebelum elemen portType.
Masing-masing pesan yang disebutkan di semua operasi di bagian PortType didefinisikan sebagai satu elemen tersendiri. Pesan bisa terdiri dari beberapa bagian (part). Part bisa menyatakan parameter operasi beserta tipe datanya.
<message name="HelloWorldRequest"> <part name="null" type="xsd:any" /> </message>
<message name="HelloWorldResponse">
<part name="return" type="xsd:string" /> </message>
Apabila part mempunyai tipe data kompleks, tipe data akan didefinisikan di bagian Types. Pada contoh, part menggunakan tipe data sederhana XML Schema. Tipe data XML Schema dapat dilihat di http://www.w3.org/TR/xmlschema-2/
Types
Lihat elemen types di bagian awal dokumen WSDL (atau sebelum elemen message).
<types>
<xsd:schema targetNamespace="http://teduh.dirgahayu.com">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema> </types>
Binding
Lihat elemen binding setelah elemen portType.
Binding menyatakan format pesan dan protokol transport bagi portType. Binding mempunyai nama dan merujuk ke portType tertentu. Pada contoh, protokol transport yang digunakan adalah
SOAP/HTTP.
Tiap operasi ditentukan gaya (style) pemanggilannya, misal rpc berarti Remote Procedure Call. Tiap pesan dalam operasi ditentukan format encoding yang digunakan, misal SOAP encoding.
<binding name="HelloWSDLBinding" type="tns:HelloWSDLPortType"> <soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="HelloWorld">
<soap:operation soapAction="uri:hello.php#HelloWorld" style="rpc"/> <input><soap:body use="encoded"
namespace="http://teduh.dirgahayu.com"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input> <output><soap:body use="encoded"
namespace="http://teduh.dirgahayu.com"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output> </operation>
</binding>
Service
Lihat elemen service di bagian akhir dokumen WSDL atau setelah elemen binding.
Service merupakan kumpulan port . Suatu port menyatakan alamat fisik suatu binding. Service dan port mempunyai nama. Dengan NuSOAP, nama port diberikan secara otomatis dengan merujuk pada nama service.
<service name="HelloWSDL">
<port name="HelloWSDLPort" binding="tns:HelloWSDLBinding">
<soap:address location="http://localhost/tier2/hello.php"/> </port>
Pengembangan client
Fokus pengembangan client pada panduan ini adalah untuk memfasilitasi cara penggunaan WSDL untuk pemanggilan server, bukan detil pemrograman dengan PHP dan NuSOAP.
Tulis program berikut, simpan sebagai file client.php di folder tier1 (client)
<?php
require_once('lib/nusoap.php');
//buat soap client dengan merujuk pada WSDL dari service yang dituju
$client = new nusoap_client('http://localhost/tier2/hello.php?wsdl');
//cek error
$err = $client->getError(); if ($err) {
echo '<h2>Soap client error</h2><pre>' . $err . '</pre>'; }
//pemanggilan operasi tanpa parameter
$result = $client->call('HelloWorld', //panggil operasi
array(null)); //tanpa parameter
if (!$result) {
echo "Tidak ada hasil (result = false)"; } else {
echo $result; //tulis hasilnya
}
echo '<br/>'; ?>
Buka alamat localhost/tier1/client.php pada browser.
Operasi dengan parameter
Tambahkan operasi berikut pada program hello.php di server. Letakkan sebelum baris untuk penanganan request.
//operasi dengan parameter function Hello($name) {
return 'Hello, ' . $name . '!'; }
$server->register('Hello', //nama operasi
array('name' => 'xsd:string'), //parameter input
array('return' => 'xsd:string'), //parameter output
$namespace, //namespace
'uri:hello.php#Hello' //soapaction
);
//operasi dengan dua parameter function Penjumlahan($op1, $op2) {
$hasil = $op1 + $op2; return $hasil;
}
$server->register('Penjumlahan', //nama operasi
array('bilangan1' => 'xsd:double',
'bilangan2' => 'xsd:double'), //parameter input
array('hasil' => 'xsd:double'), //parameter output
$namespace, //namespace 'uri:hello.php#Penjumlahan' //soapaction
);
Lihat dan cermati WSDL yang dihasilkan.
Tambahkan baris program berikut pada program client.php di client.
//pemanggilan operasi dengan satu parameter
$result = $client->call('Hello', //panggil operasi
array('name' => 'Dunia')); //satu parameter
if (!$result) {
echo "service returned false"; } else {
echo $result; }
echo '<br/>';
//pemanggilan operasi dengan dua parameter
$result = $client->call('Penjumlahan', //panggile operasi
array('bilangan1' => 145.7, //parameter 1
'bilangan2' => 51.4)); //parameter 2
if (!$result) {
echo "service returned false"; } else {
echo $result; }
echo '<br/>';
Tugas pengganti kuliah
Buat service kalkulator sederhana dengan operasi berikut.
double penjumlahan (double op1, double op2) ; op1 + op2 double pengurangan (double op1, double op2) ; op1 - op2 double perkalian (double op1, double op2) ; op1 * op2 double pembagian (double op1, double op2) ; op1 / op2
Buat program client yang menampilkan form HTML (seperti contoh berikut, boleh tidak sama persis). Jika tombol diklik, client memanggil operasi perhitungan yang sesuai pada service dan menampilkan hasilnya pada text {hasil perhitungan}.