Web Service Dengan Menggunakan WSDL
Dokumen WSDL menyediakan metadata untuk suatu service. NuSOAP mengizinkan programmer menentukan WSDL yang di-generate untuk suatu layanan dengan menggunakan beberapa method dalam class soap_server. Untuk men-generate WSDL adalah dengan mengeksekusi method “configureWSDL”.
Berikut ini adalah contoh sebuah aplikasi server yang menyediakan service dengan menggunakan WSDL dengan menggunakan contoh aplikasi sebelumnya:
contactServerWSDL.php<?php
require_once('nusoap.php');
require_once('adodb/adodb.inc.php');
$server = new soap_server();
// configure WSDL file
$server->configureWSDL('Contact Person', 'urn:contactServerWSDL');
$server->register('contact', // method name
array('input' => 'xsd:String'), // input parameters
array('output' => 'xsd:Array'), // output parameters
'urn:contactServerWSDL', // namespace
'urn:contactServerWSDL#contact', // soapaction
'rpc', // style
'encoded', // use
'Daftar kontak person' // documentation
);
$server->register('contact_detail', // method name
array('input' => 'xsd:Array'), // input parameters
array('output' => 'xsd:Array'), // output parameters
'urn:contactServerWSDL', // namespace
'urn:contactServerWSDL#contact_detail', // soapaction
'rpc', // style
'encoded', // use
'Contact detail' // documentation
);
function contact() {
$db = &ADONewConnection('mysqlt');
$db->Connect('localhost', 'root', 'root', 'db_soap');
$rs = $db->Execute("select * from contact");
$result = $rs->GetArray();
foreach($result as $row=>$value)
{
$return_value[] = array(
'name'=> $value['name'],
'company'=> $value['company'],
'address'=> $value['address'],
'phone'=> $value['phone'],
'email'=> $value['email']
);
}
return $return_value;
}
function contact_detail($param) {
$db = &ADONewConnection('mysqlt');
$db->Connect('localhost', 'root', 'root', 'db_soap');
$rs = $db->Execute("select * from contact where id=".$param['id']);
$result = $rs->GetArray();
foreach($result as $row=>$value)
{
$return_value[] = array(
'name'=> $value['name'],
'company'=> $value['company'],
'address'=> $value['address'],
'phone'=> $value['phone'],
'email'=> $value['email']
);
}
return $return_value;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
Pada contoh atas, aplikasi menyediakan service dengan menggunakan WSDL dengan cara mengeksekusi method “configureWSDL”:$server->configureWSDL('Contact Person', 'urn:contactServerWSDL');
WSDL yang dikonfigurasi di atas menggunakan 2 parameter input. Parameter pertama menggambarkan nama web service yaitu “Contact Person”, dan parameter kedua yang bersifat optional yang menggambarkan namespace WSDL, yaitu “contactServerWSDL”.
Setelah melakukan konfigurasi WSDL, selanjutnya aplikasi server melakukan registrasi semua service yang disediakan sekaligus mendefinisikan detail pengoperasiannya:
$server->register('contact', // method name
array('input' => 'xsd:String'), // input parameters
array('output' => 'xsd:Array'), // output parameters
'urn:contactServerWSDL', // namespace
'urn:contactServerWSDL#contact', // soapaction
'rpc', // style
'encoded', // use
'List of contact person' // documentation
);
Dalam men-generate WSDL, parameter-parameter pengoperasian yang digunakan pada tiap-tiap service harus didefinisikan. Parameter tersebut adalah:
register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle='')
Keterangan:
name : Nama method service yang disediakan
in : Nilai input berupa array asosiatif (param name => param type)
out : Nilai output berupa array asosiatif (param name => param type)
namespace: Informasi namespace pada service yang disediakan
soapaction: Informasi soap action pada service yang disediakan
style : Optional style atau bernilai false
use : Optional use (decoded | literal) atau bernilai false
documentation: Optional deskripsi dokumentasi WSDL
encodingStyle: Optional style encoding
Setelah melakukan registrasi service dan mendefinisikan semua detail pengoperasiannya, selanjutnya aplikasi server menyediakan method service:
function contact() {
}
function contact_detail() {
….
}
Gambar Aplikasi server dengan WSDL yang ditampilkan melalui browser |
Gambar Detail operasi pada item service yang disediakan |
<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="urn:contactServerWSDL"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:contactServerWSDL">
<types>
<xsd:schema targetNamespace="urn:contactServerWSDL">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema>
</types>
<message name="contactRequest">
<part name="input" type="xsd:String" /></message>
<message name="contactResponse">
<part name="output" type="xsd:Array" /></message>
<message name="contact_detailRequest">
<part name="input" type="xsd:Array" /></message>
<message name="contact_detailResponse">
<part name="output" type="xsd:Array" /></message>
<portType name="Contact PersonPortType">
<operation name="contact">
<documentation>List of contact person</documentation>
<input message="tns:contactRequest"/>
<output message="tns:contactResponse"/>
</operation>
<operation name="contact_detail">
<documentation>Contact detail</documentation>
<input message="tns:contact_detailRequest"/>
<output message="tns:contact_detailResponse"/>
</operation>
</portType>
<binding name="Contact PersonBinding" type="tns:Contact PersonPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="contact">
<soap:operation soapAction="urn:contactServerWSDL#contact" style="rpc"/>
<input>
<soap:body use="encoded" namespace="urn:contactServerWSDL"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
<output>
<soap:body use="encoded" namespace="urn:contactServerWSDL"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
</operation>
<operation name="contact_detail">
<soap:operation soapAction="urn:contactServerWSDL#contact_detail" style="rpc"/>
<input>
<soap:body use="encoded" namespace="urn:contactServerWSDL"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
<output>
<soap:body use="encoded" namespace="urn:contactServerWSDL"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>
</operation>
</binding>
<service name="Contact Person">
<port name="Contact PersonPort" binding="tns:Contact PersonBinding">
<soap:address location="http://localhost/soap/contoh/contactServerWSDL.php"/>
</port>
</service>
</definitions>
Gambar Menampilkan dokumen WSDL |
<?php
require_once('nusoap.php');
$client = new soapclient('http://localhost/soap/contoh/contactServerWSDL.php?wsdl', true);
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
if (empty($id)) {
$param = "";
$result = $client->call('contact',array($param));
}
else {
$param = array('id'=>$id);
$result = $client->call('contact_detail',array($param));
}
if (!empty($result)) {
echo "<table border=1>";
echo "<tr bgcolor='#cccccc'>";
echo "<th>Name</th>";
echo "<th>Company</th>";
echo "<th>Address</th>";
echo "<th>Phone</th>";
echo "<th>Email</th>";
echo "</tr>";
foreach ($result as $item) {
echo "<tr>";
echo "<td>".$item['name']."</td>";
echo "<td>".$item['company']."</td>";
echo "<td>".$item['address']."</td>";
echo "<td>".$item['phone']."</td>";
echo "<td>".$item['email']."</td>";
echo "</tr>";
}
echo "</table>";
}
?>
Perhatikan pada contoh aplikasi client di atas, aplikasi client mengeksekusi class “soapclient” dengan memasukkan parameter URL yang mengacu pada URL lokasi aplikasi server dengan menambahkan parameter “?wsdl” yang mengindikasikan bahwa aplikasi server menggunakan WSDL:
$client = new soapclient('http://localhost/soap/contoh/contactServerWSDL.php?wsdl', true);
Setelah mengeksekusi class “soapclient”, selanjutnya aplikasi client melakukan pemanggilan service dengan mengeksekusi method “call”:
if (empty($id)) {
$param = "";
$result = $client->call('contact',array($param));
}
else {
$param = array('id'=>$id);
$result = $client->call('contact_detail',array($param));
}
Pada kode di atas, variabel $id adalah parameter yang terima sebagai parameter input pada pemanggilan service “contact_detail”. Namun apabila variabel $id bernilai kosong (empty) maka aplikasi client akan memanggil service “contact”.
Berikut ini adalah hasil aplikasi client “contactClientWSDL.php” yang ditampilkan melalui browser, hasilnya akan sama seperti pada contoh sebelumnya:
Gambar Aplikasi client yang mengeksekusi service dengan menggunakan WSDL
Gambar Aplikasi client dengan menambahkan parameter string query “id”
Seperti pada gambar di atas, dapat kita lihat bahwa aplikasi web service yang menggunakan WSDL akan mengeluarkan hasil yang sama dengan aplikasi yang tidak menggunakan WSDL. Namun demikian, web service dengan menggunakan WSDL lebih dianjurkan untuk mengambarkan kepada client tentang definisi semua service yang disediakan sekaligus definisi semua detail pengoperasiannya.
Hal ini akan bermanfaat pada saat setiap terjadi perubahan mekanisme pada aplikasi server (misalnya terjadi penambahan service yang baru ataupun perubahan pada detail pengoperasiannya), maka client dapat segera menyesuaikan dengan memanfaatkan data informasi dari WSDL.
Share This :
comment 0 Comment
more_vert