Skip to content

Python vs .NET Web Service

July 29, 2006

Mengakses Web Service/SOAP yang dibuat dalam .NET Framework (C#) dengan Python adalah salah satu tantangan yang harus saya penuhi sewaktu menyelesaikan skripsi. Awalnya mudah saja: Dive Into Python menulis tentang SOAPpy, library Python untuk mengakses Web Service. But there wouldn’t be this post if SOAPpy works OOTB :D

Masalah muncul seketika. SOAP request yang dikirimkan oleh SOAPpy tidak dimengerti oleh .NET. Selidik punya selidik ternyata SOAP XML yang dikrimkan oleh SOAPpy memiliki format yang sedikit berbeda dengan yang diinginkan .NET. Karena hal itu service tidak dijalankan. Kalau sudah begini apa solusinya?

Hack your own module! Buat module sendiri untuk akses web service dengan format XML yang diharapkan .NET! Membunuh lalat dengan roket? Tidak juga. Web Service berjalan di atas protokol HTTP menggunakan data XML. Python memiliki module urllib dan urllib2 untuk akses HTTP. Untuk XML processing ada module xml.dom.minidom. Dasarnya sudah ada, tinggal dikembangkan.

Ada dua masalah utama yang perlu ditangani. Yang pertama adalah menghasilkan SOAP request yang dimengerti .NET. Daripada repot mencari spesifikasi resmi SOAP gunakan saja spesifikasi yang disediakan Visual Studio.NET. Tujuan module ini adalah agar jalan dengan .NET, bukan semua web service. Module xml.dom.minidom menyelesaikan masalah ini dengan sempurna.

Masalah yang kedua adalah membuat pemanggilan Web Service semudah memanggil fungsi Python. Dengan menggunakan special method __getattr__ kita bisa menaggapi semua pemanggilan attribute/method yang tidak dikenal. Sebenarnya solusi ini mencontek dari kode SOAPpy. Masalah kedua beres!

Cara kerjanya sebagai berikut. Setiap function call yang datang ke module ini akan diubah menjadi XML (SOAP request). Setelah itu menggunakan urllib2, data tersebut dikirimkan lewat POST method ke web service endpoint. Server akan membalas dengan XML pula (SOAP response). Data ini diubah menjadi instance xml.dom.minidom (agar mudah dibaca) dan menjadi return value function call tersebut.

Ilustrasinya seperti ini:

Hasilnya adalah module SOAPi.py. Kode-asal-jadi-yang-penting-jalan! Kode ini masih banyak kelemahannya. Antara lain ia hanya dapat mengirimkan string. Integer sebenarnya bisa, tetapi harus dijadikan string terlebih dahulu. Tipe data yang lebih kompleks seperti array dan datetime belum bisa dikirimkan.

Penggunaan

Untuk sebuah web method C# seperti ini:

[WebMethod]
public string HelloWorld(String name) {
  return "Hello World " + name;
}

Kode python untuk memanggilnya adalah:

from SOAPi import SOAPProxy

server = SOAPProxy("http://10.1.1.1/test/Service.asmx",
  "uri:name.space")
e = server.HelloWorld(name='Fred')

print e.toxml()

Perhatikan bahwa kita langsung memanggil method HelloWorld pada object SOAPProxy, sesuai dengan nama web method-nya. Perhatkan pula bahwa nama parameter (name) perlu dituliskan secara eksplisit. Ini dikarenakan karena object proxy tidak mengetahui daftar parameter yang diperlukan. Urutan parameter tidak penting, asalkan nama yang ditulis sesuai dengan dengan yang ada di server maka semua akan berjalan lancar.

technorati tags: , , ,

6 Comments
  1. Web service di .NET memang agak dudul. Diakses pake JWSDP juga pake akal-akalan serupa. Saya sendiri sering bermain .NET, tapi kalo urusan webservice, lebih percaya ke Apache Axis.

    Btw, karena library-mu dibuat devoted buat .NET, kenapa ga sekalian saja sediakan cara-cara akses non-native data type .NET webservice . Misalnya saja, SOAP Request yang mengharapkan nilai kembalian DataSet. Banyak yang pusing gara-gara non-native data type di .NET webservice itu lho..

  2. Hmm baru tau ternyata web service .NET juga tidak akur sama Java. Gimana nih Microsoft?

    Sebenarnya library ini tidak memproses nilai kembalian sama sekali, hanya diubah menjadi instance xml dom. Jadinya nilai kembalian apapun bisa diakses lewat fungsi DOM. Masih primitif banget. Yang lebih penting sebenarnya agar bisa mengirimkan data type seperti datetime ke servicenya.

  3. Albert permalink

    Why don’t you use Message-Driven Bean(MDB)? Reminds me to a person that make this statement “I can show you that MDB is better than Web Service” :)

  4. Albert: We don’t use Java :D

  5. haduh.. saya malah bingung mo mulai dari mana ni.. saya mo bikin TA about web service gitu deh.. is there any suggestion? yg simpel aja gitu deh..

    :D

    btw, lam kenal.. isinya manteb!

  6. Zam: Thanks. Hmm mengenai web service, enaknya belajar dari mana yah. Kalau untuk Python bisa mulai dari dive into python sih. Kalau .NET dari Visual Studio bisa langsung ngebuat web service. Mudah banget. Coba google aja sedikit. Good Luck yah.

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

%d bloggers like this: