Membuat Web Service SOAP dengan PHP Dan Memanggilnya Di Client Java


Pada tulisan ini, saya akan mencoba membuat sebuah web service SOAP + WSDL dengan PHP. Lalu, untuk pengujian, saya akan mencoba mengakses service dari sebuah program Java SE.

Membuat Web Service Provider Dengan PHP

SoapServer adalah class bawaan dari PHP untuk membuat server SOAP 1.1 dan SOAP 1.2. Sayangnya, SoapServer tidak memiliki fitur untuk membuat file WSDL secara otomatis. Bila ingin web service menyediakan WSDL, saya harus membuat file tersebut secara manual?!! Lalu bila pada perubahan definisi service, saya harus merombak file WSDL secara manual?!!

Itu sebabnya, kali ini saya akan framework PHP, yaitu Zend Framework. Framework andalan PHP ini menyediakan class Zend_Soap_Autodiscover untuk menghasilkan WSDL secara otomatis berdasarkan class/method yang akan dipublikasikan. Saya akan memakai IDE Zend Studio yang ‘sangat’ mendukung Zend Framework.

Saya mulai dengan membuat sebuah proyek PHP baru dengan nama server_ws dan lokasi penyimpanannya langsung di htdocs. Saya memakai Zend Framework 1.11.11. Untuk menghemat waktu, saya tidak akan membuat controller baru, melainkan langsung memodifikasi file application/controllers/IndexController.php.   Dan dengan alasan yang sama,  saya  menyertakan kode program class service langsung di file ini. Berikut ini adalah isi file IndexController.php yang telah saya modifikasi:

<?php
class Perhitungan {

  /**
   * Menghasilkan jumlah dari $angka1 dan $angka2
   *
   * @param int $angka1
   * @param int $angka2
   * @return int
   */
  function tambah($angka1, $angka2) {
    return $angka1 + $angka2;
  } 
}

class IndexController extends Zend_Controller_Action
{

  public function indexAction()
  {
    $this->getHelper('viewRenderer')->setNoRender(true);
    ini_set("soap.wsdl_cache_enabled", "0");

    if (isset($_GET['wsdl'])) {
      $autodiscover = new Zend_Soap_AutoDiscover();
      $autodiscover->setBindingStyle(array('style'=>'rpc'));
      $autodiscover->setOperationBodyStyle(array('use'=>'literal'));
      $autodiscover->setClass('Perhitungan');
      $autodiscover->handle();
    } else {
      $soap = new Zend_Soap_Server("http://localhost/server_ws/public/index?wsdl");
      $soap->setClass('Perhitungan');
      $soap->handle();
    }
  }
}
?>

Karena PHP tidak memiliki tipe data yang ketat, maka class yang akan dipanggil wajib memiliki docblock (@param dan @return). Nilai yang ada di docblock ini akan dipakai untuk melakukan pemetaan tipe data di WSDL nantinya. Pada contoh ini, saya membuat sebuah operasi sederhana yang hanya melakukan penjumlahan nilai parameter pertama dan nilai parameter kedua.

Pada IndexController, saya memanggil setNoRender(true) karena pada saat controller ini dipanggil, tidak akan ada view yang di-render, melainkan salah satu dari response SOAP atau WSDL yang akan dikirim ke client.

Bila client memanggil memanggil controller dengan menyertakan ?wsdl, maka IndexController akan membuat instance Zend_Soap_AutoDiscover yang akan menghasilkan WSDL. Pemanggilan method setClass dengan argumen Perhitungan menunjukkan bahwa WSDL akan dihasilkan berdasarkan isi class Perhitungan.

Penggunaan setBindingStyle dengan nilai array ‘style’=>’rpc’ menyebabkan WSDL yang dihasilkan akan memakai nilai “rpc” pada atribut “style” di <soap:binding>. Saat ini, bila memakai “document style“, web service tidak akan dapat dipanggil dengan baik di Java dan .NET (yang memakai standar WS-I). Permasalahan ini dapat dilihat di http://framework.zend.com/issues/browse/ZF-6351.

Bila controller dipanggil ini tanpa tambahan ?wsdl, maka sebuah instance Zend_Soap_Server akan dibuat dan siap untuk melayani SOAP request dari consumer.

Untuk menguji apakah WSDL berhasil di-generate secara otomatis, saya membuka browser dan mengetikkan alamat http://localhost/server_ws/public/index?wsdl. Seharusnya akan muncul WSDL dengan isi seperti berikut ini:

Tampilan WSDL Yang Dihasilkan Secara Otomatis

Tampilan WSDL Yang Dihasilkan Secara Otomatis

Membuat Web Service Consumer Dengan Java

Untuk memakai web service SOAP di Java, saya membuat sebuah proyek Java Application di NetBeans. Saya memberi nama proyek tersebut sebagai wsconsumer, dan membuat sebuah Main Class dengan nama co.id.jocki.Main.

Setelah proyek selesai dibuat, saya memilih menu File, New File. Pada dialog yang muncul, saya memilih Web Services di bagian Categories, dan memilih Web Service Client di bagian File Types seperti yang diperlihatkan di gambar berikut ini:

Membuat Web Service Client

Membuat Web Service Client

Setelah men-klik tombol Next, saya akan mengisi WSDL URL dengan lokasi URL yang mengembalikan WSDL, yaitu http://localhost/server_ws/public/index?wsdl. Saya mengisi bagian package dengan nilai co.id.jocki.webservice seperti yang diperlihatkan di gambar berikut ini:

Step Membuat Web Service Client

Step Membuat Web Service Client

Pada saya men-klik tombol Finish, NetBeans secara otomatis akan menjalan wsimport. Tools ini akan menghasilkan class Java secara otomatis sehingga saya tidak perlu membuat kode program yang rumit.

Untuk memanggil web service, saya perlu menambahkan beberapa baris perintah lagi. Tapi untungnya, NetBeans kembali membantu saya. Yang saya lakukan berikutnya adalah men-drag operasi yang akan dipanggil ke layar editor, seperti yang diperlihatkan di
gambar berikut ini:

Membuat Kode Program Secara Otomatis

Membuat Kode Program Secara Otomatis

Lalu saya menambahkan satu baris program pada method main seperti isi class Main adalah:

public class Main {

  public static void main(String[] args) {
    System.out.println("Hasil tambah(10,20) adalah " + tambah(10,20));
  }

  private static int tambah(int angka1, int angka2) {
    co.id.jocki.webservice.PerhitunganService service = new co.id.jocki.webservice.PerhitunganService();
    co.id.jocki.webservice.PerhitunganPort port = service.getPerhitunganPort();
    return port.tambah(angka1, angka2);
  }
}

Pada saat saya menjalankan program tersebut, ia akan mengirim SOAP REQUEST ke server PHP, menerima response dari server yang sama, dan akhirnya menampilkan output berupa:

Hasil tambah(10,20) adalah 30
About these ads

Perihal Solid Snake
I'm nothing...

12 Responses to Membuat Web Service SOAP dengan PHP Dan Memanggilnya Di Client Java

  1. Gabriel Purba mengatakan:

    Selamat malam pak.
    Trima kasih buat postingannya pak, sangat membantu.

    Pak saat ini sy sedang membuat implementasi SOA dengan webservice (dengan nusoa+wsdl)
    Apakan dengan menyediakan aplikasi berbasis webservice sy sudah menerapkan SOA?

    atau haruskah menghubungkan min 2 aplikasi?

    • Solid Snake mengatakan:

      Secara singkat, kita bisa mengatakan bahwa SOA adalah arsitektur dimana consumer bisa menggunakan layanan (service) yang disediakan provider tanpa harus mengerti detail implementasi service tersebut. Sebagai contoh, membuat web service yang menyediakan operasi insert, update, delete ke database bukan SOA karena consumer harus mengerti detail implementasi operasi tersebut (nama tabel, struktur tabel,dsb).

      Boleh hanya 1 aplikasi, dengan syarat ada provider dan consumer-nya, dimana consumer berinteraksi dengan provider melalui sebuah arsitektur komunikasi dan manajemen yang standar (seperti web service). Coba bandingkan dengan arsitektur yang terlahir dari SOA, yaitu cloud computing (‘anak‘-nya SOA).

      • Gabriel Purba mengatakan:

        Kadang agak rincu saat ditanya perbedaan SOA dan web service. saya tau bahwa soa tdk sama dengan web service. tetapi web service adalah salah 1 implementasi dri SOA.

        dan rincu saat membua/menjelaskan SOA yg di web service dalam bentuk laporan.

        Btw Trima kasih banyak Pak
        God Bless

  2. Solid Snake mengatakan:

    Untuk menjelaskan perbedaannya:
    SOA (Service Oriented Architecture) adalah sebuah arsitektur, sebuah metode terstruktur dalam merancang sistem, dan dapat dibandingkan dengan aristektur lain seperti multi-tier, MVC, dsb.. Halaman http://www.microsoft.com/education/ww/solutions/Pages/soa.aspx menjelaskan dengan ringkas bahwa SOA bukan sebuah produk; SOA adalah metode untuk merancang sistem – sketsa atau denah – yang mengarahkan bagaimana sumber daya ICT dapat di-integrasikan satu sama lainnya.

    Web service adalah kumpulan teknologi seperti XML, Web Services Description Language (WSDL), Simple Object Access Protocol (SOAP), Universal Description, Discovery, and Integration(UDDI), dan lainnya.
    Sumber: http://www.oracle.com/technetwork/articles/javase/soa-142870.html

    Tanpa arsitektur service-oriented (SOA), web service bisa jalan sendiri dengan sifat standardized dan consumable. Tetapi SOA menyebabkan web service menjadi reusable, abstracted, published, formal, dan relevant.
    Sumber: http://msdn.microsoft.com/en-us/library/aa480021.aspx

    Untuk menjelaskan arsitektur sistem yang dibuat dalam laporan, bila UML dirasa tidak lengkap, maka bisa memakai SoaML (http://en.wikipedia.org/wiki/SoaML) yang merupakan salah profile UML dan dirancang khusus untuk pemodelan & perancangan service dalam SOA.

    Good luck dan sukses dengan tugas akhirnya.

    • Gabriel Purba mengatakan:

      Wah baru dengar SoaML, cuma sepertinya cukup mengunakan UML sdh lumayan lengkap.

      pak Konsep SOA sendiri di indonesia “kurang” diminati atau masih kurang dikenal ya? stlah meninjau bbrapa kampus ungulan di jakarta (berharap bisa dpt buku referensi) ternyata sangat jarang bahkan susah mencari buku yg membahas SOA maupun web service. yg ada paling Jurnal2 baru, sdngkan konsep SOa sendiri kan sudah lama muncul dan di implementasikan di Luar negri.

  3. Ping-balik: Perbandingan Web Service SOAP antara Java EE vs PHP « The Solid Snake

  4. Gabriel Purba mengatakan:

    Slamat malam pak.
    Adakah bapak memahami konsep dan implementasi SOA dengan benar? Sangat membutuhkan anda untuk menyamakan pemahaman saya tentang SOA.

    saya mendapat pemahaman dari membaca buku yg membahas tentang SOA, tetapi saat bertemu dngan beberapa orng (anggap saja seperti dosen atau programer) yg mengaku mengerti dan lagi belajar JUGA trentang SOA berpendapat yg berbeda dngan yg saya pahami.

    itu membuat saya sangat goyah, menjadi kurang yakin akan pemahaman saya (padahal dri buku ).

    saya was2 saja jika saat program yg sudah selesai, tiba2 saat diuji dianggap salah pemahaman akan konsep SOA sendiri.

    menurut saya itu akan menyakitkan, apalagi ada beberapa teman yg mengambil topik yg sama, jk berbeda akan lebih was2 (sAngat tdk mau untuk menyamakan persepsi tentang SOA).

    • Solid Snake mengatakan:

      Salah satu hal yang dapat ditempuh untuk menyamakan pendapat adalah dengan memakai referensi standar yang sama. Pada http://www.ibm.com/developerworks/library/ws-soa-standards, terdapat link ke The Open Group SOA Reference Architecture (SOA RA) yang merupakan ‘sampel’ proyek SOA tetapi tidak terikat pada vendor tertentu. Jika kalian merujuk ke standar yang teruji di industri, tidak terikat oleh istilah vendor sepihak, tidak dipengaruhi motivasi bisnis vendor tertentu, maka kosa-kata kalian akan bermakna sama. Coba mulai dengan gunakan standar Open Group sebagai acuan.

      Jika ingin mempertahankan pendapat, maka lupakan arsitektur SOA sejenak. Tapi lihat langsung ke implementasinya, misalnya Oracle SOA Suite yang dibuat khusus untuk meng-implementasi-kan SOA. Contoh penggunaan dapat dilihat di http://docs.oracle.com/cd/E23943_01/dev.1111/e10224/fod_intro2.htm#CHDEHIJJ. Jika Anda memakai Oracle SOA Suite, maka besar kemungkinan Anda harus mengikuti definisi & penerapan SOA versi Oracle. Dengan demikian, sistem yang Anda buat dengan Oracle SOA Suite adalah SOA, sehingga tidak perlu takut disalahkan pada saat diuji.

      • Solid Snake mengatakan:

        Sedikit tambahan, pengalaman pribadi sekitar 12 tahun silam, saya membaca sebuah buku fenomenal tentang menerapkan Object Oriented Programming (OOP) di Visual Basic 6. Saat itu dukungan teknologi implementasi OOP di suite Microsoft masih terbatas. Tapi buku tersebut benar-benar membuat kode program Visual Basic 6 yang OOP: memiliki sifat inheritance dengan mendefinisikan parent sebagai variabel di dalam child (containment); memiliki sifat polymorphism dengan memakai nama fungsi yang konsisten seperti SetWarnaRGB, SetWarnaCMYK; dan memiliki sifat encapsulation dengan class module..

        Walaupun kode program menjadi panjang & aneh, tapi kode program sudah mengikuti filosofi OOP dan dapat dibilang OOP. Saat teknologi baru semakin mendukung OOP seperti sekarang, dengan munculnya keyword “extend”, fitur “overload” & “override”, maka teknik primitif seperti itu tidak dibutuhkan lagi. Tapi Anda pasti setuju bahwa keyword dan fitur tersebut bukanlah yang dimaksud dengan OOP.

        Saya tidak tahu pastinya kesulitan definisi seperti apa yang Anda hadapi, tetapi akan sangat membantu bila dapat memisahkan pendekatan dari sisi design/arsitektur dan dari sisi implementasi.

  5. Gabriel Purba mengatakan:

    Thank you so much,
    Bapak baik sekali

  6. Ping-balik: Mengakses Web Services Dari Aplikasi Java Micro Edition (Mobile) « The Solid Snake

  7. abdul wachid mengatakan:

    Pak, saya mau tanya, apakah sample web service SOAP di atas dapat berjalan pada protokol https? Sebab saya coba di protokol http bisa jlan tapi pada mode https tidak dapat jalan, bagaimana solusinya?

Apa komentar Anda?

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Logout / Ubah )

Twitter picture

You are commenting using your Twitter account. Logout / Ubah )

Facebook photo

You are commenting using your Facebook account. Logout / Ubah )

Google+ photo

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Ikuti

Get every new post delivered to your Inbox.

Bergabunglah dengan 38 pengikut lainnya.

%d blogger menyukai ini: