Web Service dengan Delphi

July 15, 2008 at 4:58 pm | Posted in Code Samples, Tutorials | 19 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.

19 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

  4. mas gmana yach souce codenya program perpustakaan ?

  5. waduh, tambah bingung

  6. weiiis.. keren banget … thanks !

  7. pada bagian IIS disebutkan
    “Kopi MD5SvcIIS.dll ke direktori script IIS, biasanya di direktori c:\Inetpub\Scripts.”
    nah, pada IIS 7.5 milik win7, direktori inetpub\scripts tidak ada, adanya inetpub\AdminScripts, namun ketika saya pindahkan dll nya ke folder tersebut, saya tidak bisa akses dll tersebut melalui browser dengan alamat
    http://localhost/AdminScripts/MD5SvcIIS.dll

    apakah versi IIS yang digunakan disini berbeda dengan yang saya pakai?
    terimakasih,

  8. ternyata ada kekurangan setting di IIS nya…
    sekarang soap server nya sudah bisa dijalankan
    terimakasih,

    • punya saya ko gag bisa jalan di web browser…
      knapa y???

  9. Bismillahirrohmanirrohim …

    Bagus sekali materinya ….

    Tapi sekarang saya menggunakan Embarcadero Delphi 2010, yang mana udah jadi C++, bukan pascal lagi.

    Gmn implementasinya ???

    Syukron

  10. mas coding buat perpustakaan untuk mencari data buku sama pemesanan buku menggunakan web services gmana yah?

  11. salut, artikel2nya mas, bagus2.
    slmt siang,
    mas, saya punya aplikasi sederhana yang dibuat dari delphi
    saya ingin aplikasi ini bisa diakses di browser internet
    apakah dengan membuat web service bisa memberikan solusi bagi permasalahan saya,
    atau apakah ada cara lain yang bisa pecahkan masalah saya ?
    newbie,
    blm pernah coba membuat web service.

    thz, Eddy

    • Tergantung. Bisa ya bisa tidak. Aplikasi Windows bisa jalan di browser bisa dengan mengubahnya menjadi ActiveX, cuma cara ini hanya bisa dijalankan di IE. Tujuan web service sebenarnya adalah agar dua atau lebih aplikasi dapat saling berinteraksi melalui mekanisme HTTP. Jika aplikasi Anda menyediakan fungsionalitas yang dapat digunakan oleh aplikasi lain melalui mekanisme HTTP, maka web service adalah solusinya.

  12. Salam kenal Mas, mau menanyakan tentang HTTPRIO.
    Aplikasi WSDL saya sudah berjalan lancar untuk Insert dan menampilkan data, tapi ketika aplikasi di tutup selalu muncul error :
    “Exception in Module Project1.exe at 001B13F8. Invalid Pointer”
    Mohon pencerahannya, terimakasih

    • Invalid pointer operation biasanya terjadi ketika anda mengalokasikan memory (misal dengan GetMem()) lalu mengubah alamat memori yang ditunjuk (disengaja atau tidak) kemudian menghapusnya dengan FreeMem().

  13. saya mau kursus buat web service, kasus dari saya sendiri.
    bisa ngak mas,
    thz, Eddy

  14. kursus buat web service di delphi sampai di-Upload ke Internet pake VPS.

  15. Mas, kalo insert data di clientnya secara Array menggunakan HTTPRIO dengan function terdapat field-field seperti ini gimana ya ?

    function es_jrs_kejadian_klaim(const ID_REGISTER: WideString;
    const SIFAT_CEDERA: WideString;
    const JENIS_TINDAKAN: WideString;
    const DOKTER_BERWENANG: WideString;
    const BIAYA: Integer;
    const process_file: process_fileType;
    out detail: detailType): WideString; stdcall;

    Terimakasih sebelumnya

  16. file uMD5.pas masih punya pak? share di mari pak…tks


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.