Integrasi .NET XML Web Services dan Java ME menggunakan KSOAP2

10 Mei 2012

Pada 5 tahun terakhir ini, perkembangan teknologi Service-oriented Architecture (SOA) sangatlah pesat. Tentu saja kita bisa lihat dari beberapa vendor pengembang perangkat lunak yang mengusung SOA sebagai salah satu fitur dari produknya tersebut. Sebut saja .NET dan Java yang semakin fasih dalam mengembangkan teknologi ini.
Teknologi SOA pada dasarnya didesain untuk mengintegrasikan platform yang berbeda, sehingga bisa saling berkomunikasi satu sama lain. Dengan alasan ini, SOA menggunakan format-format standar yang mampu mengkomunikasi beberapa platform tersebut.
Web Sevice yang merupakan salah satu bentuk realisasi dari teknologi SOA yang paling populer saat ini. Aplikasi berbasis SOA akan memiliki beberapa lapisan aplikasi (multi-tier), lapisan presentasi (presentation layer), lapisan logika bisnis(business logic layer), lapisan persistensi (persistence layer). Seluruh fungsi dapat dibentuk ke dalam layanan-layanan (services).
Penggunaan teknologi Web Service bisa dirasakan oleh hampir seluruh platform, karena setiap platform bisa berkomunikasi dengan platform yang lain melalui teknologi ini.
Pada artikel ini akan dijelaskan mengenai bagaimana mengintegrasikan 2 platform, yaitu .NET dan Java. Web Service server akan ditanamkan pada platform .NET dan Java ME sebagai Web Service client akan mengakses layanan yang disediakan menggunakan bantuan pustaka kSOAP2.
Gambar di bawah ini menggambarkan arsitektur dari .NET XML Web Services.
Arsitektur XML Web Services
Berikut beberapa perangkat lunak yang dibutuhkan dalam pengembangan aplikasi ini:
  • SOAP v1.1
  • kSOAP v2.1.2
  • Microsoft .NET Framework 3.0 SDK
  • Microsoft Access 2003
  • Java Development Kit 1.6.0
  • MIDP 2.0
  • CLDC 1.1
Web Service server Menggunakan .NET (C#)
Sebelum Anda membuat kode sumber untuk aplikasi Web Service server, terlebih dahulu persiapkan database yang akan digunakan. Pada artikel ini, database yang akan digunakan adalah MS Access 2003 (.mdb). Berikut struktur tabel Asset yang akan digunakan dalam aplikasi ini:
Setelah tabel Asset terbentuk, saatnya Anda mengisi data-data pada tabel tersebut.
Berikut ini adalah kode sumber untuk aplikasi Web Service server yang dibangun menggunakan C#. IDE yang digunakan untuk pengembangan aplikasi adalah Visual Studio .NET 2008.
01using System;
02using System.Collections;
03using System.Collections.Generic;
04using System.ComponentModel;
05using System.Data;
06using System.Linq;
07using System.Web;
08using System.Web.Services;
09using System.Xml.Linq;
10using System.Xml.Serialization;
11using System.Web.Services.Protocols;
12
13using System.Data.OleDb;
14
15namespace AssetWS
16{
17    /// <summary>
18    /// Summary description for AssetService
19    /// </summary>
20    [WebService(Namespace = "http://tempuri.org/")]
21    [WebServiceBinding(ConformsTo = WsiProfiles.None)]
22    [ToolboxItem(false)]
23    // To allow this Web Service to be called from script, using ASP.NET AJAX,
24    // uncomment the following line.
25    // [System.Web.Script.Services.ScriptService]
26    public class Service1 : System.Web.Services.WebService
27    {
28
29        [SoapRpcMethod, WebMethod]
30        [XmlInclude(typeof(Person))]
31        public Person[] getPerson()
32        {
33            List<Person> persons = new List<Person>();
34            Person person1 = new Person("Robertus Lilik Haryanto", 27, new DateTime(1983, 10, 2));
35            persons.Add(person1);
36            Person person2 = new Person("Fransiska Krisni Defianti", 27, new DateTime(1983, 3, 28));
37            persons.Add(person2);
38            return persons.ToArray();
39        }
40
41        [SoapRpcMethod, WebMethod]
42        [XmlInclude(typeof(Asset))]
43        public Asset[] getAsset(String code)
44        {
45            OleDbConnection objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\AssetDB.mdb");
46            objConn.Open();
47
48            String query = "SELECT Id, Code, Name, Description, Price FROM Asset " +
49                        "WHERE Code = '" + code + "'";
50            OleDbDataAdapter da = new OleDbDataAdapter(query, objConn);
51
52            DataSet ds = new DataSet();
53            da.Fill(ds, "Asset");
54
55            DataTable dt = ds.Tables["Asset"];
56
57            List<Asset> assets = new List<Asset>();
58            foreach (DataRow row in dt.Rows)
59            {
60                Asset asset = new Asset(Convert.ToInt32(row["Id"].ToString()),
61                                row["Code"].ToString(), row["Name"].ToString(), row["Description"].ToString(),
62                                Convert.ToInt32(row["Price"].ToString()));
63                assets.Add(asset);
64            }
65            return assets.ToArray();
66        }
67
68        private void InitializeComponent()
69        {
70
71        }
72    }
73}
Setelah Web Service server berhasil dibuat, publish dan jalankan.
Web Service client Menggunakan Java ME dan kSOAP2
Untuk membuat Web Service client menggunakan kSOAP2, pertama yang perlu dibuat adalah class parser yang akan membaca Complex Type yang merupakan tipe data balikan dari Web Service server (.NET). Class parser ini merupakan turunan dari class KvmSerializable yang terdapat pada pustaka kSOAP2.
001import java.util.Hashtable;
002import org.ksoap2.serialization.KvmSerializable;
003import org.ksoap2.serialization.PropertyInfo;
004
005/**
006 *
007 * @author Robertus Lilik Haryanto
008 */
009public class AssetKvmSerializable implements KvmSerializable {
010
011    private Integer id;
012    private String code;
013    private String name;
014    private String description;
015    private Integer price;
016
017    public String getCode() {
018        return getProperty(1).toString();
019    }
020
021    public String getDescription() {
022        return getProperty(3).toString();
023    }
024
025    public Integer getId() {
026        return Integer.valueOf(getProperty(0).toString());
027    }
028
029    public String getName() {
030        return getProperty(2).toString();
031    }
032
033    public Integer getPrice() {
034        return Integer.valueOf(getProperty(4).toString());
035    }
036
037    public void setPrice(Integer price) {
038        this.price = price;
039    }
040
041    public Object getProperty(int index) {
042        switch (index) {
043            case 0:
044                return id;
045            case 1:
046                return code;
047            case 2:
048                return name;
049            case 3:
050                return description;
051            case 4:
052                return price;
053            default:
054                return null;
055        }
056    }
057
058    public int getPropertyCount() {
059        return 5;
060    }
061
062    public void setProperty(int index, Object obj) {
063        switch (index) {
064            case 0:
065                id = Integer.valueOf(obj.toString());
066                break;
067            case 1:
068                code = obj.toString();
069                break;
070            case 2:
071                name = obj.toString();
072                break;
073            case 3:
074                description = obj.toString();
075                break;
076            case 4:
077                price = Integer.valueOf(obj.toString());
078                break;
079            default:
080                break;
081        }
082    }
083
084    public void getPropertyInfo(int index, Hashtable hshtbl, PropertyInfo pi) {
085        switch (index) {
086            case 0:
087                pi.type = PropertyInfo.INTEGER_CLASS;
088                pi.name = "id";
089                break;
090            case 1:
091                pi.type = PropertyInfo.STRING_CLASS;
092                pi.name = "code";
093                break;
094            case 2:
095                pi.type = PropertyInfo.STRING_CLASS;
096                pi.name = "name";
097                break;
098            case 3:
099                pi.type = PropertyInfo.STRING_CLASS;
100                pi.name = "description";
101                break;
102            case 4:
103                pi.type = PropertyInfo.INTEGER_CLASS;
104                pi.name = "price";
105                break;
106            default:
107                break;
108        }
109    }
110}
Setelah kode sumber di atas selesai dibuat, sekarang saatnya membuat aplikasi utama Web Service client menggunakan Java ME. Buatlah class MIDlet seperti di bawah ini:
001package com.secangkirkopipanas.binus.inhouse.autojaya.me.ch04.extra;
002
003import java.util.Vector;
004import javax.microedition.lcdui.Alert;
005import javax.microedition.lcdui.AlertType;
006import javax.microedition.lcdui.Command;
007import javax.microedition.lcdui.CommandListener;
008import javax.microedition.lcdui.Display;
009import javax.microedition.lcdui.Displayable;
010import javax.microedition.lcdui.Form;
011import javax.microedition.lcdui.StringItem;
012import javax.microedition.midlet.*;
013import org.ksoap2.SoapEnvelope;
014import org.ksoap2.serialization.SoapObject;
015import org.ksoap2.serialization.SoapSerializationEnvelope;
016import org.ksoap2.transport.HttpTransport;
017
018/**
019 * @author Robertus Lilik Haryanto
020 */
021public class AssetServiceMIDlet extends MIDlet implements CommandListener {
022
023    private Display disp;
024    private Form form;
025    private Command cmdInvoke;
026    private Command cmdExit;
027    private static final String SOAP_ACTION = "http://tempuri.org/getAsset";
028    private static final String METHOD_NAME = "getAsset";
029    private static final String NAMESPACE = "http://tempuri.org/";
030    private static final String URL = "http://localhost:49185/AssetService.asmx";
031
032    private static final String ENCODED_TYPES_NAMESPACE = "http://tempuri.org/encodedTypes";
033
034    public void startApp() {
035        disp = Display.getDisplay(this);
036        form = new Form("Asset Service");
037
038        cmdInvoke = new Command("INVOKE", Command.OK, 0);
039        cmdExit = new Command("EXIT", Command.EXIT, 1);
040        form.addCommand(cmdInvoke);
041        form.addCommand(cmdExit);
042        form.setCommandListener(this);
043
044        disp.setCurrent(form);
045    }
046
047    // Fungsi yang akan dijalan pada saat pause
048    public void pauseApp() {
049    }
050
051    // Fungsi yang akan dijalan pada saat exit
052    public void destroyApp(boolean unconditional) {
053        notifyDestroyed();
054    }
055
056    public void commandAction(Command c, Displayable d) {
057        if (c == cmdExit) {
058            destroyApp(true);
059        } else if (c == cmdInvoke) {
060
061            System.out.println("Invoking service...");
062            AssetKvmSerializable asset = null;
063            try {
064                asset = invokeService();
065            } catch (Exception e) {
066                Alert a = new Alert("Error", "", null, AlertType.ERROR);
067                a.setString(e.getMessage());
068                disp.setCurrent(a, form);
069                e.printStackTrace();
070            }
071
072            System.out.println("Parsing the response...");
073            if (asset != null) {
074                StringItem siID = new StringItem("ID", asset.getProperty(0).toString());
075                StringItem siCode = new StringItem("Code", asset.getProperty(1).toString());
076                StringItem siName = new StringItem("Name", asset.getProperty(2).toString());
077                StringItem siDescription = new StringItem("Description", asset.getProperty(3).toString());
078                StringItem siPrice = new StringItem("Price", asset.getProperty(4).toString());
079                form.append(siID);
080                form.append(siCode);
081                form.append(siName);
082                form.append(siDescription);
083                form.append(siPrice);
084                disp.setCurrent(form);
085            }
086        }
087    }
088
089    public AssetKvmSerializable invokeService() throws Exception {
090
091        SoapObject client = new SoapObject(NAMESPACE, METHOD_NAME);
092        client.addProperty("code", "00100001");
093
094        HttpTransport transport = new HttpTransport(URL);
095
096        // Creating the Soap Envelope
097        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
098        envelope.setOutputSoapObject(client);
099
100        //MarshalDate dateMarshal = new MarshalDate();
101        //dateMarshal.register(envelope);
102
103        envelope.addMapping(ENCODED_TYPES_NAMESPACE, "Asset", new AssetKvmSerializable().getClass());
104
105        // Call the WebService
106        System.out.println("Calling service...");
107        transport.call(SOAP_ACTION, envelope);
108
109        // Getting the Result
110        System.out.println("Getting response...");
111        System.out.println(envelope.getResponse());
112        Vector data = (Vector) envelope.getResponse();
113
114        AssetKvmSerializable asset = null;
115        if (data != null && !data.isEmpty()) {
116            asset = (AssetKvmSerializable) data.firstElement();
117            System.out.println("ID: " + asset.getProperty(0));
118            System.out.println("Code: " + asset.getProperty(1));
119            System.out.println("Name: " + asset.getProperty(2));
120            System.out.println("Description: " + asset.getProperty(3));
121            System.out.println("Price: " + asset.getProperty(4));
122        }
123
124        return asset;
125    }
126}
Build project Java ME di atas, dan jalankan. Pada layar aplikasi MIDlet Anda akan menampilkan hasil respon dari server mengenai data yang dicari sesuai dengan data yang ada di database.
Anda bisa unduh kode sumber lengkap disini:

0 komentar:

Posting Komentar