Web Service dengan Delphi

July 15, 2008 at 4:58 pm | In Code Samples, Tutorials | 3 Comments
Tags: , , ,

Zamrony P Juhara

(Artikel ini dimuat pertama kali di majalah PC Media edisi 04/2007)

Dukungan Delphi pada web service dimulai pada versi 6 dan dilanjutkan terus sampai sekarang. Delphi membungkus implementasi SOAP dengan sangat rapi. Jika anda menganggap berusaha memahami kode-kode pada SOAP (pada artikel sebelumnya) sebagai suatu mimpi buruk, maka anda masih cukup normal. Saya pribadi pusing melihat isi SOAP message. Untungnya menggunakan Delphi, kita tidak perlu berurusan dengan proses parsing SOAP message. Delphi menghandlenya untuk kita sehingga kita bisa fokus ke bagaimana mewujudkan web service daripada pusing-pusing menerjemahkan SOAP message.

Membuat Server Web Service.

Agar mudah dan fokus ke bagaimana membuat server web service menggunakan Delphi, Saya akan membuat web service sederhana untuk mengenkripsi teks dengan algoritma MD5. Saya akan menggunakan unit uMD5.pas ditulis oleh seseorang yang sayang sekali saya lupa namanya. Kodenya saya ambil dari sebuah posting sebuah forum Delphi yang juga saya lupa alamatnya. Kepada authornya, saya pribadi mohon maaf.

Aplikasi web service ini akan menerima request berisi teks yang akan dienkripsi, melakukan enkripsi dan mengembalikan teks hasil enkripsi ke aplikasi klien.

Anda diharapkan telah memiliki pengetahuan paling tidak mengenai web server dan cara kerjanya.

Membuat SOAP Server Application

Buka Delphi. Klik File->New->Other. Pilih tab WebServices dan pilih SOAP Server Application.

Gbr 1.1 Dialog aplikasi server SOAP baru.

Gbr 1.1 Dialog aplikasi server SOAP baru.

Klik OK, selanjutnya akan ditampilkan dialog New SOAP Server Application seperti gambar berikut:

Gbr 1.2 Dialog untuk memilih tipe web server yang akan dipakai.

Gbr 1.2 Dialog untuk memilih tipe web server yang akan dipakai.

Seperti yang terlihat di atas, ada beberapa pilihan web server yang bisa dipakai.

  • Pilih ISAPI/NSAPI Dyanamic Link Library bila anda menggunakan IIS atau Netscape Web Server.
    CGI Stand-alone executable. Pilih opsi ini bila aplikasi anda akan dijalankan sebagai aplikasi CGI (Common Gateway Interface).
  • Apache 1.x Shared module (DLL). Pilih opsi ini bila anda menggunakan Apache 1.x
  • Apache 2.x Shared module (DLL). Pilih opsi ini bila anda menggunakan Apache 2.0 ke atas.
  • Web App Debugger executable. Pilih opsi ini bila ingin menggunakan web server milik Delphi. Untuk development, saya sarankan menggunakan pilihan ini, karena sangat memudahkan pada saat kita melakukan debugging aplikasi. Jika sudah stabil, aplikasi dapat kita ubah menggunakan tipe server lain dengan mudah. Untuk artikel ini saya gunakan pilihan ini dan mengisi Class Name dengan TMD5Server.

Klik OK. Selanjutnya Delphi akan membuat aplikasi dan akan menampilkan dialog konfirmasi apakah kita ingin membuat SOAP Server Interface. Jika anda pilih untuk tidak menciptakan SOAP Server Interface sekarang, anda dapat membuat SOAP Server Interface nanti dengan cara klik File->New->Other->WebServices-> SOAP Server Interface.

Jika anda membuat SOAP Server Interface akan ditampilkan dialog seperti berikut:

Gbr 1.3 SOAP Server Interface dialog.

Gbr 1.3 SOAP Server Interface dialog.

  • Service name adalah nama web service. Namanya harus memenuhi standard penamaan variabel pada Delphi.
  • Unit identifier adalah nama file unit yang akan dihasilkan.
  • Generate comments, jika dipilih, menyebabkan Delphi akan menambahkan komentar mengenai interface ke dalam source code interface.
  • Generate sample methods, jika dipilih, menyebabkan Delphi akan menambahkan contoh bagaimana memanggil metode interface.
  • Service activation model berisi tipe aktivasi. Per Request, instance implementasi kelas server akan dibuat tiap kali ada request dan akan dibebaskan setelah request selesai ditangani. Global, instance implementasi kelas hanya ada satu dan akan menghandle semua request.

Isikan service name dan unit identifier sebagai MD5Svc dan biarkan lainnya apa adanya. Klik OK. Delphi akan menghasilkan empat unit yakni unit form utama, unit web module, unit bernama MD5SvcImpl.pas dan MD5SvcIntf.pas. Unit MD5SvcImpl.pas berisi implementasi interface yang dideklarasikan di MD5SvcIntf.pas. Berikut ini kode kedua unit tersebut.

MD5SvcImpl.pas

{ Invokable implementation File for TMD5Svc
which implements IMD5Svc }

unit MD5SvcImpl;

interface

uses InvokeRegistry, Types,
   XSBuiltIns, MD5SvcIntf;

type

  { TMD5Svc }
  TMD5Svc = class(TInvokableClass, IMD5Svc)
  public
  end;

implementation

initialization
  { Invokable classes must be registered }
  InvRegistry.RegisterInvokableClass(TMD5Svc);

end.

MD5SvcIntf.pas


{ Invokable interface IMD5Svc }

unit MD5SvcIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

  { Invokable interfaces must
  derive from IInvokable }
  IMD5Svc = interface(IInvokable)
  ['{DD07E88A-A66D-48A6-911F-51D515375506}']

    { Methods of Invokable interface
    must not use the default }
    { calling convention;
   stdcall is recommended }
  end;

implementation

initialization
  { Invokable interfaces must be registered }
  InvRegistry.RegisterInterface(TypeInfo(IMD5Svc));

end.

Tambahkan metode bernama Encrypt, sehingga deklarasi interface IMD5Svc menjadi seperti berikut:

{ Invokable interfaces must
  derive from IInvokable }
  IMD5Svc = interface(IInvokable)
  ['{DD07E88A-A66D-48A6-911F-51D515375506}']
     function Encrypt(const
            atext:string):string;
     stdcall;
    { Methods of Invokable interface
     must not use the default }
    { calling convention;
     stdcall is recommended }
  end;

Selanjutnya anda tambahkan juga metode Encrypt ke kelas TMD5Svc dan lengkapi implementasinya sehingga menjadi seperti berikut:

{ TMD5Svc }
  TMD5Svc = class(TInvokableClass, IMD5Svc)
  public
     function Encrypt(const atext:string):string;
stdcall;
  end;

dan bagian implementasinya menjadi seperti ini:

uses uMD5;
{ TMD5Svc }

function TMD5Svc.Encrypt(const 
atext: string): string;
begin
  result:=MD5(atext);
end;

Setelah itu simpan proyek dan namakan proyek sebagai MD5Svc.dpr.

Menguji Aplikasi Server.

Ok, kita sudah siap. Jalankan aplikasi seperti biasa. Kemudian jalankan Web App Debugger dari Tools->Web App Debugger. Pastikan web server aktif dengan mengklik tombol Start. Selanjutnya buka browser dan browsing ke alamat http://localhost:8081/MD5Svc.TMD5Server. MD5Svc adalah nama aplikasi (MD5Svc.dpr) dan TMD5Server adalah nama kelas yang kita isi saat memilih tipe web server. Di browser akan tampil informasi mengenai server MD5Svc.

Gbr 1.4 Halaman service info.

Gbr 1.4 Halaman service info.

Untuk mendapatkan dokumen WSDL, klik IMD5Svc [WSDL].

Ok, aplikasi server sudah siap, mari kita buat aplikasi klien untuk menggunakan server MD5Svc.

Membuat Aplikasi Klien

Buat aplikasi baru, drag drop kontrol Edit, Label dan Button. Beri nama edText, edMD5 dan btnEncrypt, susun sehingga menjadi seperti gambar di bawah:

Gbr 1.5 Desain antar muka aplikasi klien.

Gbr 1.5 Desain antar muka aplikasi klien.

Selanjutnya kita import dokumen WSDL. Jalankan MD5Svc.exe dan Web App Debugger. Klik File->New->Other->WebServices->WSDL Importer (lihat Gbr 1.6).

Gbr 1.6 Dialog import WSDL

Gbr 1.6 Dialog import WSDL

Isi lokasi WSDL dengan http://localhost:8081/MD5Svc.TMD5Server/wsdl/IMD5Svc. Klik Next. Jika sukses anda akan mendapatkan dialog seperti di bawah. Klik Finish.

Gbr 1.7 Import WSDL sukses.

Gbr 1.7 Import WSDL sukses.

Setelah itu Delphi akan menghasilkan file unit bernama IMD5Svc1.pas. Simpan unit ini misal dengan nama u_wsdl_IMD5Svc.pas. Tambahkan unit u_wsdl_IMD5Svc.pas ke dalam klausa uses pada form utama. Tambahkan event OnClick pada btnEncrypt dan lengkapi sehingga menjadi sebagai berikut:

implementation

uses u_wsdl_IMD5Svc;

{$R *.dfm}

procedure TfrmMain.btnEncryptClick(Sender:
TObject);
begin
  edMD5.Text:=GetIMD5Svc.Encrypt(edText.Text);
end;

end.;

Ok jalankan. Pastikan MD5Svc.exe jalan demikian pula server Web App Debugger jalan. Jika sukses, tiap kali anda mengklik tombol Encrypt, isi text akan dikonversi ke MD5.

Mengkonversi Web Service

Web service yang sudah kita buat di atas hanya cocok untuk development environment. Untuk dapat digunakan pada production environment kita perlu konversi ke tipe web server lain.

CGI

Buat aplikasi SOAP Server Application baru dan pilih type web servernya sebagai CGI stand alone executables. Klik OK, Delphi akan menanyakan apakah anda hendak membuat definisi interface baru, klik No, karena kita tidak akan membuat interface baru. Simpan proyek misal sebagai MD5SvcCGI.dpr.

Dari Project Manager tambahkan file MD5SvcIntf.pas, MD5SvcImpl.pas dan uMD5.pas ke dalam project yang baru. Lakukan kompilasi. Setelah kompilasi selesai kopi file MD5SvcCGI.exe ke direktori script milik web server. Contoh pada server Apache direktori script defaultnya ada pada direktori cgi-bin dimana Apache diinstall. Milik saya ada di C:\apache\cgi-bin\. Untuk IIS biasanya di direktori Scripts. Pada komputer saya ada di c:\Inetpub\Scripts.

Untuk mengakses halaman Service Info, pastiken web server sudah aktif. Buka web browser dan browse ke http://localhost/cgi-bin/MD5SvcCGI.exe. Anda akan mendapatkan halaman web yang mirip Gbr 1.4 di atas. Dokumen WSDL bisa diakses dari URL http://localhost/cgi-bin/MD5SvcCGI.exe/wsdl/IMD5Svc.

Langkah terakhir adalah memodifikasi aplikasi klien agar menggunakan WSDL server web service yang baru. Buka aplikasi klien MD5Client.dpr, import WSDL dari URL di atas, setelah sukses ubah namanya menjadi IMD5SvcCGI.pas. Pada unit form utama, ubah unit u_wsdl_MD5Svc.pas menjadi IMD5SvcCGI.pas. Lakukan kompilasi dan jalankan. Output aplikasi akan sama seperti versi sebelumnya.

IIS

Buat aplikasi SOAP Server Application baru dan pilih type web servernya sebagai ISAP/NSAPI Dynamic Link Library. Klik OK, Delphi akan menanyakan apakah anda hendak membuat definisi interface baru, klik No, karena kita tidak akan membuat interface baru. Simpan proyek misal sebagai MD5SvcIIS.dpr.

Seperti pada CGI, tambahkan unit MD5SvcIntf.pas, MD5SvcImpl.pas dan uMD5.pas ke project MD5SvcIIS.dpr. Lakukan kompilasi. Kopi MD5SvcIIS.dll ke direktori script IIS, biasanya di direktori c:\Inetpub\Scripts.

Untuk mengakses halaman Service Info, buka web browser dan browse ke http://localhost/Scripts/MD5SvcIIS.dll. Dokumen WSDL bisa diakses dari URL http://localhost/Scripts/MD5SvcIIS.dll/wsdl/IMD5Svc.

Apache 1.x

Buat aplikasi SOAP Server Application baru dan pilih type web servernya sebagai Apache 1.x Shared Module. Klik OK, Delphi akan menanyakan apakah anda hendak membuat definisi interface baru, klik No, karena kita tidak akan membuat interface baru. Simpan proyek misal sebagai MD5SvcApache.dpr.

Tambahkan unit MD5SvcIntf.pas, MD5SvcImpl.pas dan uMD5.pas ke project MD5SvcIIS.dpr. Lakukan kompilasi. Kopi MD5SvcApache.dll ke direktori module Apache, milik saya di c:\apache\modules.

Apache 2.x

Apache 2.x caranya hampir sama dengan Apache 1.x, hanya saja anda memilih Apache 2.x Shared module.

Karena pada Apache 2.0.39 terdapat lubang keamanan, maka mulai Apache 2.0.40, tim developer Apache mengubah interfacenya, sehingga Delphi 7 hanya mendukung versi hingga Apache 2.0.39. Agar Delphi 7 mendukung versi 2.0.40 ke atas, anda perlu mengubah isi file HTTPD2.pas. Cari deklarasi konstanta MODULE_MAGIC_NUMBER_MAJOR dan MODULE_MAGIC_NUMBER_MINOR.

Untuk Apache versi 2.0.40 ubah menjadi:

{ Apache 2.0.40 }
MODULE_MAGIC_NUMBER_MAJOR = 20020628;
MODULE_MAGIC_NUMBER_MINOR = 0;

Untuk Apache versi 2.0.41 sampai 2.0.45 ubah menjadi:

{ Apache 2.0.41..45 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 0;

Untuk versi 2.0.46


 { Apache 2.0.46 }

MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 2;

Untuk versi 2.0.47 dan 2.0.48

{ Apache 2.0.47..48 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 4;

Untuk versi 2.0.49

{ Apache 2.0.49 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 7;

Untuk versi 2.0.50

{ Apache 2.0.50 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 8;

Untuk versi 2.0.51 sampai 2.0.53

{ Apache 2.0.51..53 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 9;

Untuk versi 2.0.54 dan 2.0.55

{ Apache 2.0.55 }
MODULE_MAGIC_NUMBER_MAJOR = 20020903;
MODULE_MAGIC_NUMBER_MINOR = 11;

Tambahkan baris kode berikut sebelum deklarasi tipe conn_rec.

ap_conn_keepalive_e = (AP_CONN_UNKNOWN,
                       AP_CONN_CLOSE,
                       AP_CONN_KEEPALIVE);

Pada deklarasi tipe conn_rec, ubah

(** Are we still talking? *)
    flags: Cardinal;
    { The following are in the flags bitset:
    unsigned aborted:1;

    (** Are we going to keep the connection
alive for another request?
     *  -1 fatal error, 0 undecided, 1 yes   *)
    signed int keepalive:2;

    (** have we done double-reverse
DNS? -1 yes/failure, 0 not yet,
     *  1 yes/success *)
    signed int double_reverse:2;
    }

menjadi

(** Are we still talking? *)
    flags1: Cardinal;
    { The following are in the flags bitset:
    unsigned aborted:1; }

    (** Are we going to keep the connection
alive for another request?
     * @see ap_conn_keepalive_e *)
    keepalive: ap_conn_keepalive_e;

    flags2: Cardinal;
    { The following are in the flags bitset:
    (** have we done double-reverse
DNS? -1 yes/failure, 0 not yet,
     *  1 yes/success *)
    signed int double_reverse:2;
    }

Lakukan Build agar HTTPD2.pas ikut dikompilasi ulang. Langkah ini hanya berlaku bila anda menggunakan Delphi 6 atau 7. Untuk informasi lebih lanjut tentang ini, klik ke URL
http://www.drbob42.com/delphi7/apache2040.htm.

3 Comments »

RSS feed for comments on this post. TrackBack URI

  1. sebetulnya dalam real life kegunaan web service ini apa ya?
    real life maksud saya dalam aplikasi kasih bisnis misalnya.

    Terima kasih

  2. Demo ini sekedar sample bagaimana mengkonstruksi sebuah server web service dan client yang mengkonsumsi web service.

    Penggunaan dalam bisnis real?

    Misalnya Anda menemukan algoritma canggih rahasia untuk mengkompress teks dengan rasio kompresi sangat kecil. Dari pada menjual lisensi penggunaan algoritma tersebut ke aplikasi pihak ketiga (yang berarti Anda harus memberitahukan cara kerja algoritma tersebut), Anda bisa menjual jasa mengompress/dekompress menggunakan algoritma temuan Anda.

    Aplikasi Anda yang mengimplementasi algoritma tersebut berada di server milik Anda sendiri.

    Client hanya merequest dengan memberi input misalnya teks yang akan dikompress, dan menerima output berupa teks terkompress, atau sebaliknya input teks yang terkompress dan outputnya teks terdekompress.

    Klien tidak tahu (atau tidak peduli) bagaimana Anda mengimplementasi algoritma tersebut sepanjang rasio kompresinya sesuai keinginan mereka.

    Tiap kali service Anda digunakan, Anda dapat men-charge sejumlah fee.

    Ini hanya contoh. Kemungkinannya hanya dibatasi oleh imajinasi Anda.

  3. kang saya ingin membuat web dengan delphi, diatas sudah diberi contohnya, pertanyaan saya, apakah buat aplikasi yang tidak terlalu rumit web dengan delphi ini sudah bisa powerfull ya, terimakasih


Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.