Pada artikel kali ini, akan dibahas tutorial membangun webservice WSDL menggunakan NuSOAP. Sebelum kita mulai, ada baiknya kita menjabarkan dulu tools atau library yang akan digunakan selama proses pembuatan webservice. Adapun tools atau library yang digunakan adalah :
- PHP 7.4 dan MySQL (tutorial ini menggunakan bundle Xampp)
- Composer (untuk instalasi codeigniter dan nusoap).
- CodeIgniter 4.
- NuSOAP.
Tahap pertama adalah menyiapkan database, buatlah sebuah database baru dengan nama gudang dengan menggunakan PHPMyAdmin atau tools database lainnya.
Kemudian buatlah sebuah tabel untuk menampung data yang akan digunakan oleh webservice yang kita bangun. Adapun query pembuatan tabel adalah sebagai berikut :
CREATE TABLE `gudang`.`barang` ( `id_barang` BIGINT NOT NULL AUTO_INCREMENT , `kode_barang` VARCHAR(255) NOT NULL , `nama_barang` VARCHAR(255) NOT NULL , PRIMARY KEY (`id_barang`)) ENGINE = InnoDB;
Adapun struktur table setelah berhasil dibuat dapat dilihat pada gambar berikut :
Setelah persiapan database selesai, selanjutnya kita akan menyiapkan aplikasi webservice PHP menggunakan framework CI. Tutorial ini menggunakan bundle Xampp dengan versi PHP 7.4. Anda dapat menyiapkan framework CI menggunakan instalasi manual ataupun menggunakan composer. Jika menggunakan composer, lakukanlah langkah – langkah berikut :
Pada folder htdocs di direktori Xampp, siapkan sebuah folder untuk webservice anda. Pada tutorial ini akan dibuat sebuah folder wsbarang. Pastikan anda telah menginstal composer. Jalankan command prompt, dan ubah aktif direktori ke folder htdocs anda.
Lalu jalankan perintah berikut :
composer create-project codeigniter4/appstarter wsbarang
Dimana wsbarang merupakan nama folder webservice yang anda buat di langkah 1.
Masih di command prompt yang sama, ganti aktif direktori ke folder wsbarang dan ketikkan perintah berikut untuk menginstall nusoap.
composer require econea/nusoap
Lakukan konfigurasi database pada codeigniter di direktori app/Config/Database.php sesuai dengan konfigurasi server MySQL anda.
Selanjutnya kita akan masuk kedalam pemrograman server WSDL. Pertama sekali buatlah sebuah file model di app/Models dengan nama BarangModel.php.
<?php
namespace App\Models;
use CodeIgniter\Model;
class BarangModel extends Model
{
protected $table = 'barang';
protected $primaryKey = 'id_barang';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = true;
protected $allowedFields = ['kode_barang', 'nama_barang'];
protected $validationRules = ['kode_barang' => 'required|is_unique[barang.kode_barang]',
'nama_barang' => 'required'];
protected $validationMessages = ['kode_barang' => [
'required' => 'Maaf. Kode Barang tidak boleh kosong.',
'is_unique' => 'Maaf. Kode Barang sudah digunakan oleh data yang lain.'
],
'nama_barang' => [
'required' => 'Maaf. Nama Barang tidak boleh kosong.',
]];
protected $skipValidation = false;
}
?>
Kemudian, buatlah sebuah class untuk menampung response dari server wsdl dengan nama file Serverresponse.php di direktori app/Libraries.
<?php
namespace App\Libraries;
class Serverresponse {
public $responseCode = 0;
public $responseMessage = 'Unknown error!';
public $returnBarang = NULL;
}
?>
Buatlah sebuah class Server untuk menangani fungsi – fungsi server wsdl pada NuSoap dengan nama Serverwsdl.php pada direktori app/Libraries. Pada class ini juga akan dibuat fungsi pembacaan data (getListBarang) yang akan disertakan sebagai fungsi atau operasi yang dapat diakses oleh client. Fungsi atau operasi yang akan tersedia pada service wsdl harus di definisikan sebelum masuk ke bagian program bagian dari kelas. Hal ini dikarenakan fungsi yang akan di register sebagai service harus merupakan fungsi top-level bukan fungsi atau method yang dimiliki oleh object.
<?php
function getListBarang($limit, $offset)
{
$barangModel = new \App\Models\BarangModel();
$responseObject = new \App\Libraries\Serverresponse();
$responseObject->returnBarang = array();
if ($limit == 0)
{
$barang = $barangModel->findAll();
}else{
$barang = $barangModel->findAll($limit, $offset);
}
$responseObject->returnBarang = $barang;
$responseObject->responseCode = 1;
$responseObject->responseMessage = 'Successful!';
return $responseObject;
}
use econea\nusoap;
namespace App\Libraries;
class Serverwsdl extends \soap_server {
private $serviceName;
private $domainName;
function __construct($service_name, $domain)
{
parent::__construct();
$this->configureWSDL($service_name, $domain);
$this->soap_defencoding = 'utf-8';
$this->decode_utf8 = false;
$this->encode_utf8 = true;
}
public function prepareGetListBarang()
{
$this->wsdl->addComplexType(
'Barang', // name
'complexType', // typeClass (complexType|simpleType|attribute)
'struct', // phpType: currently supported are array and struct (php assoc array)
'all', // compositor (all|sequence|choice)
'', // restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
// elements = array ( name = array(name=>'',type=>'') )
array(
'id_barang' => array(
'name' => 'id_barang',
'type' => 'xsd:int'
),
'kode_barang' => array(
'name' => 'kode_barang',
'type' => 'xsd:string'
),
'nama_barang' => array(
'name' => 'nama_barang',
'type' => 'xsd:string'
)
)
);
$this->wsdl->addComplexType(
'ArrayBarang', // name
'complexType', // typeClass (complexType|simpleType|attribute)
'array', // phpType: currently supported are array and struct (php assoc array)
'', // compositor (all|sequence|choice)
'SOAP-ENC:Array', // restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
// elements = array ( name = array(name=>'',type=>'') )
array(),
// attrs
array(
array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:Barang[]'
)
),
'tns:Barang'
);
$this->wsdl->addComplexType(
'ResponseObject', // name
'complexType', // typeClass (complexType|simpleType|attribute)
'struct', // phpType: currently supported are array and struct (php assoc array)
'all', // compositor (all|sequence|choice)
'', // restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
// elements = array ( name = array(name=>'',type=>'') )
array
(
'responseCode' => array('type' => 'xsd:int'),
'responseMessage' => array('type' => 'xsd:string'),
'returnBarang' => array('type' => 'tns:ArrayBarang')
)
);
//die(var_dump(function_exists('getListBarang')));
$this->register('getListBarang', // method name
array('limit' => 'xsd:int', 'offset' => 'xsd:int'), // input parameters
array('return' => 'tns:ResponseObject'), // output parameters
$this->domainName, // namespace
$this->domainName.'#getListBarang', // soapaction
'rpc', // style
'encoded', // use
'Get List Barang, untuk semua barang set limit = 0' // documentation
);
}
public function startService($rawInput)
{
$this->service(isset($rawInput) ? $rawInput : '');
exit(0);
}
}
?>
Langkah berikutnya adalah membuat controller sebagai alamat dari service wsdl. Buatlah sebuah controller dengan nama file Wsbarang.php pada lokasi app/Controllers.
<?php
namespace App\Controllers;
use App\Libraries\Serverwsdl;
//use econea\nusoap;
class Wsbarang extends BaseController
{
public function index()
{
$myNamespace = 'http://localhost/wsbarang/public/wsbarang';
$server = new Serverwsdl('Wsbarang', $myNamespace);
$server->prepareGetListBarang();
$raw_input = file_get_contents('php://input');
$server->startService($raw_input);
exit(0);
}
}
Pada controller jangan lupa menyertakan class library Serverwsdl yang telah dibuat sebelumnya. $myNamespace dapat menggunakan kombinasi base_url() dan nama routing dari controller ini. Nama service ‘Wsbarang’ pada new Serverwsdl merupakan nama layanan dan tidak harus sama dengan nama controller.
Buka browser dan ketikkan url dari server wsdl seperti yang terlihat pada gambar berikut :
http://localhost/wsbarang/public/wsbarang?wsdl merupakan alamat yang natinya digunakan oleh client untuk mengakses service wsdl yang kita buat. Untuk mengujicoba service yang telah berjalan, anda dapat menggunakan aplikasi boomerang atau ekstensi boomerang pada browser chrome.
Masukkan alamat server wsdl dan klik tombol LOAD. Lalu akan muncul nama service yang kemudian klik add. Pada sidebar kiri akan muncul nama service dan fungsi atau operasi yang dapat dijalankan. Klik kanan pada operasi getListBarang lalu pilih “New Request”.
Isi nilai limit dan offset sesuai dengan banyaknya data yang ingin ditampilkan. Pastikan anda mengisi dulu data secara manual ke dalam tabel barang agar hasil respon dari server wsdl terlihat.
Tekan tombol SEND yang terletak disebelah kolom alamat server. Jika tidak ada error, maka server wsdl akan memberikan respon yang sesuai.
Sampai pada tahapan ini, server wsdl telah siap untuk melayani client. Semoga artikel ini bermanfaat, pada artikel selanjutnya akan dibahas bagaimana aplikasi client pada server wsdl menggunakan Visual Basic .Net sebagai client, stay tuned….
Source code dapat dilihat pada halaman unduhan source code, silahkan klik link berikut :