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.
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
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.
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Xml.Linq; using System.Xml.Serialization; using System.Web.Services.Protocols; using System.Data.OleDb; namespace AssetWS { /// <summary> /// Summary description for AssetService /// </summary> [WebServiceBinding(ConformsTo = WsiProfiles.None)] [ToolboxItem( false )] // To allow this Web Service to be called from script, using ASP.NET AJAX, // uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [SoapRpcMethod, WebMethod] [XmlInclude( typeof (Person))] public Person[] getPerson() { List<Person> persons = new List<Person>(); Person person1 = new Person( "Robertus Lilik Haryanto" , 27, new DateTime(1983, 10, 2)); persons.Add(person1); Person person2 = new Person( "Fransiska Krisni Defianti" , 27, new DateTime(1983, 3, 28)); persons.Add(person2); return persons.ToArray(); } [SoapRpcMethod, WebMethod] [XmlInclude( typeof (Asset))] public Asset[] getAsset(String code) { OleDbConnection objConn = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\AssetDB.mdb" ); objConn.Open(); String query = "SELECT Id, Code, Name, Description, Price FROM Asset " + "WHERE Code = '" + code + "'" ; OleDbDataAdapter da = new OleDbDataAdapter(query, objConn); DataSet ds = new DataSet(); da.Fill(ds, "Asset" ); DataTable dt = ds.Tables[ "Asset" ]; List<Asset> assets = new List<Asset>(); foreach (DataRow row in dt.Rows) { Asset asset = new Asset(Convert.ToInt32(row[ "Id" ].ToString()), row[ "Code" ].ToString(), row[ "Name" ].ToString(), row[ "Description" ].ToString(), Convert.ToInt32(row[ "Price" ].ToString())); assets.Add(asset); } return assets.ToArray(); } private void InitializeComponent() { } } } |
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.
import java.util.Hashtable; import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo; /** * * @author Robertus Lilik Haryanto */ public class AssetKvmSerializable implements KvmSerializable { private Integer id; private String code; private String name; private String description; private Integer price; public String getCode() { return getProperty( 1 ).toString(); } public String getDescription() { return getProperty( 3 ).toString(); } public Integer getId() { return Integer.valueOf(getProperty( 0 ).toString()); } public String getName() { return getProperty( 2 ).toString(); } public Integer getPrice() { return Integer.valueOf(getProperty( 4 ).toString()); } public void setPrice(Integer price) { this .price = price; } public Object getProperty( int index) { switch (index) { case 0 : return id; case 1 : return code; case 2 : return name; case 3 : return description; case 4 : return price; default : return null ; } } public int getPropertyCount() { return 5 ; } public void setProperty( int index, Object obj) { switch (index) { case 0 : id = Integer.valueOf(obj.toString()); break ; case 1 : code = obj.toString(); break ; case 2 : name = obj.toString(); break ; case 3 : description = obj.toString(); break ; case 4 : price = Integer.valueOf(obj.toString()); break ; default : break ; } } public void getPropertyInfo( int index, Hashtable hshtbl, PropertyInfo pi) { switch (index) { case 0 : pi.type = PropertyInfo.INTEGER_CLASS; pi.name = "id" ; break ; case 1 : pi.type = PropertyInfo.STRING_CLASS; pi.name = "code" ; break ; case 2 : pi.type = PropertyInfo.STRING_CLASS; pi.name = "name" ; break ; case 3 : pi.type = PropertyInfo.STRING_CLASS; pi.name = "description" ; break ; case 4 : pi.type = PropertyInfo.INTEGER_CLASS; pi.name = "price" ; break ; default : break ; } } } |
package com.secangkirkopipanas.binus.inhouse.autojaya.me.ch04.extra; import java.util.Vector; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.StringItem; import javax.microedition.midlet.*; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransport; /** * @author Robertus Lilik Haryanto */ public class AssetServiceMIDlet extends MIDlet implements CommandListener { private Display disp; private Form form; private Command cmdInvoke; private Command cmdExit; private static final String METHOD_NAME = "getAsset" ; public void startApp() { disp = Display.getDisplay( this ); form = new Form( "Asset Service" ); cmdInvoke = new Command( "INVOKE" , Command.OK, 0 ); cmdExit = new Command( "EXIT" , Command.EXIT, 1 ); form.addCommand(cmdInvoke); form.addCommand(cmdExit); form.setCommandListener( this ); disp.setCurrent(form); } // Fungsi yang akan dijalan pada saat pause public void pauseApp() { } // Fungsi yang akan dijalan pada saat exit public void destroyApp( boolean unconditional) { notifyDestroyed(); } public void commandAction(Command c, Displayable d) { if (c == cmdExit) { destroyApp( true ); } else if (c == cmdInvoke) { System.out.println( "Invoking service..." ); AssetKvmSerializable asset = null ; try { asset = invokeService(); } catch (Exception e) { Alert a = new Alert( "Error" , "" , null , AlertType.ERROR); a.setString(e.getMessage()); disp.setCurrent(a, form); e.printStackTrace(); } System.out.println( "Parsing the response..." ); if (asset != null ) { StringItem siID = new StringItem( "ID" , asset.getProperty( 0 ).toString()); StringItem siCode = new StringItem( "Code" , asset.getProperty( 1 ).toString()); StringItem siName = new StringItem( "Name" , asset.getProperty( 2 ).toString()); StringItem siDescription = new StringItem( "Description" , asset.getProperty( 3 ).toString()); StringItem siPrice = new StringItem( "Price" , asset.getProperty( 4 ).toString()); form.append(siID); form.append(siCode); form.append(siName); form.append(siDescription); form.append(siPrice); disp.setCurrent(form); } } } public AssetKvmSerializable invokeService() throws Exception { SoapObject client = new SoapObject(NAMESPACE, METHOD_NAME); client.addProperty( "code" , "00100001" ); HttpTransport transport = new HttpTransport(URL); // Creating the Soap Envelope SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(client); //MarshalDate dateMarshal = new MarshalDate(); //dateMarshal.register(envelope); envelope.addMapping(ENCODED_TYPES_NAMESPACE, "Asset" , new AssetKvmSerializable().getClass()); // Call the WebService System.out.println( "Calling service..." ); transport.call(SOAP_ACTION, envelope); // Getting the Result System.out.println( "Getting response..." ); System.out.println(envelope.getResponse()); Vector data = (Vector) envelope.getResponse(); AssetKvmSerializable asset = null ; if (data != null && !data.isEmpty()) { asset = (AssetKvmSerializable) data.firstElement(); System.out.println( "ID: " + asset.getProperty( 0 )); System.out.println( "Code: " + asset.getProperty( 1 )); System.out.println( "Name: " + asset.getProperty( 2 )); System.out.println( "Description: " + asset.getProperty( 3 )); System.out.println( "Price: " + asset.getProperty( 4 )); } return asset; } } |
Anda bisa unduh kode sumber lengkap disini:
http://secangkirkopipanas.com/
Tidak ada komentar:
Posting Komentar