Akses layanan Web dari perangkat nirkabel

Seperti yang telah saya bahas di kolom Java Nirkabel pertama , "Java Siapkan Diri untuk Layanan Web Nirkabel," kemampuan pemrosesan XML merupakan salah satu persyaratan utama untuk aplikasi layanan Web nirkabel. Namun, spesifikasi J2ME / MIDP standar (Platform Java 2, Edisi Mikro / Profil Perangkat Informasi Seluler) tidak memiliki API XML standar, yang juga tidak termasuk dalam spesifikasi MIDP 2.0 yang akan datang. Oleh karena itu, kita membutuhkan library J2ME / CLDC (Connected Limited Device Configuration) pihak ketiga yang dapat menangani XML, terutama protokol XML khusus layanan Web tersebut.

Pada artikel ini, saya membahas bagaimana memproses pesan layanan Web menggunakan paket kSOAP open source pada platform J2ME / MIDP. Seperti banyak arsitektur komputasi perusahaan lainnya, layanan Web melibatkan klien dan server. Seperti banyak diskusi fokus pada bagaimana menggunakan J2EE (Java 2 Platform, Enterprise Edition) untuk mengembangkan dan menyebarkan layanan Web di sisi server, saya hanya fokus pada sisi klien J2ME dalam artikel ini.

Keuntungan SOAP

Protokol XML penting untuk mengakses layanan Web adalah SOAP (Simple Object Access Protocol). Dibandingkan dengan teknologi pesaing, SOAP memiliki keunggulan sebagai berikut:

  1. SOAP mendefinisikan lebih dari 40 tipe data standar melalui XML Schema dan memungkinkan pengguna untuk mendefinisikan tipe data kompleks secara kustom. Dukungan tipe data yang begitu canggih membuat SOAP menjadi bahasa yang kuat dan kaya untuk bertukar informasi di antara sistem berorientasi objek yang banyak digunakan saat ini.
  2. Selain dukungan tipe data yang kuat, SOAP juga mendukung berbagai skema pengiriman pesan. Skema tersebut mencakup panggilan prosedur jarak jauh sinkron (RPC), perpesanan asinkron, perpesanan multicast (langganan), dan rute pesan kompleks dengan banyak perantara.
  3. Sejak SOAP telah mendapatkan dukungan utama sebagai standar olahpesan layanan Web, sebagian besar protokol layanan Web lainnya harus beroperasi atau terikat dengan SOAP. Misalnya, WSDL (Web Services Description Language), UDDI (Universal Description, Discovery, dan Integration), dan kebanyakan pendaftar XML mendukung SOAP; Tanda Tangan Digital XML, Enkripsi XML, SAML (Security Assertion Markup Language), dan protokol XML aman lainnya semuanya menyediakan pengikatan standar dengan SOAP. Setiap protokol pengikatan menyediakan sintaks dari elemen khususnya sendiri di dalam pesan SOAP. Dukungan penuh SOAP untuk ruang nama XML telah membuatnya mudah untuk diikat dengan protokol lain.

Karena kelebihan di atas, SOAP sudah menjadi protokol komunikasi yang paling banyak digunakan untuk layanan Web. Jadi, persyaratan inti untuk aplikasi layanan Web nirkabel adalah kemampuan untuk memahami pesan SOAP. Sekarang mari kita lihat beberapa contoh SOAP sederhana. Kode 1 mengilustrasikan pesan SOAP yang sederhana dan umum:

Daftar 1. Pesan SOAP Hello World

  Halo Dunia   

SOAP paling banyak digunakan dalam RPC layanan Web. Pesan respons SOAP dari RPC layanan Web biasanya berisi nilai yang dikembalikan di dalam Resultelemen di bawah Bodyelemen SOAP . Kode 2 menunjukkan pesan respons RPC SOAP sederhana:

Kode 2. Pesan respons RPC SOAP Hello World

   Halo Dunia    

Karena kita harus mengakses pesan SOAP secara terprogram dalam program kita, kita memerlukan parser SOAP.

Apa itu penguraian SOAP?

Setiap parser XML generik dengan dukungan namespace memahami pesan SOAP dan dapat mengekstrak informasi darinya. Secara teori, kami selalu dapat mengekstrak informasi teks dari pesan SOAP menggunakan parser XML generik dan kemudian mengonversi string teks tersebut ke objek data Java saat kami perlu menggunakannya. Misalnya, int i = Integer.parseInt("123");mengubah string teks "123"menjadi nilai integer 123. Tetapi konversi manual seperti itu membebani pemrogram aplikasi. Mengekstrak objek data Java langsung dari pesan SOAP akan memberikan pendekatan yang lebih baik. Masukkan pengurai SOAP.

Pengurai SOAP dibangun di atas parser XML generik dengan mekanisme pemetaan tipe dan penyusunan data teks khusus. Pengurai SOAP memahami informasi tipe data dalam pesan SOAP dan secara otomatis mengubah pesan SOAP menjadi objek data Java. Nilai sebenarnya dari parser adalah menyediakan transparansi pemrograman antara program Java dan pesan SOAP. Seorang programmer hanya memasukkan objek Java ke penulis SOAP, mengirim pesan, menunggu respons server, dan kemudian membaca objek Java langsung dari SOAP parser.

Seperti yang saya bahas, SOAP memiliki serangkaian fungsi yang kaya. Banyak yang menganggap dukungan penguraian SOAP pada platform nirkabel terbatas sumber daya seperti J2ME / CLDC mahal. Kesulitan praktis juga ada:

  1. Platform J2ME / CLDC yang ringan mengorbankan banyak fungsi Java standar yang berguna untuk ukuran dan kecepatan. Akibatnya, platform J2ME / CLDC hanya memiliki fungsionalitas string terbatas, masalah utama untuk setiap parser XML Java nirkabel.
  2. Penguraian SOAP membutuhkan pengurai untuk membaca seluruh dokumen ke dalam memori. Tetapi kebanyakan parser J2ME / CLDC adalah parser SAX linier yang hemat memori, yang tidak pernah membuat model objek dalam memori.
  3. Platform J2ME / CLDC tidak memiliki dukungan untuk beberapa tipe data dasar, seperti Floattipe.

Untungnya, project kSOAP memecahkan masalah ini dan menyediakan solusi SOAP untuk perangkat kecil.

kSOAP untuk menyelamatkan

Berdasarkan XML parser kXML generik sumber terbuka yang terkenal, Enhydra.org telah memulai proyek sumber terbuka untuk penguraian SOAP pada platform J2ME / MIDP — proyek kSOAP. Bagian dari proyek EnhydraME, kSOAP ditulis oleh sekelompok pengembang yang dipimpin oleh Stefan Haustein. Enhydra merilis versi alfa pertama kSOAP pada Mei 2001. Setelah setahun pengembangan, kSOAP, sekarang di versi 1.2, mendukung sekumpulan inti fungsi SOAP 1.2. Contoh artikel dan diskusi arsitektur ini berlaku untuk kSOAP versi 0.95 dan yang lebih baru (lihat Sumber untuk kode sumber lengkap). Kode berjalan di lingkungan MIDP; jika Anda baru dalam pengembangan MIDP atau perlu menyegarkan kembali keterampilan Anda, lihat seri "Pemrograman Perangkat dengan MIDP" Michael Cymerman.

Segmen kode ini mem-parsing contoh Hello World menggunakan kSOAP:

ByteArrayInputStream bis = ByteArrayInputStream baru (mesg.getBytes ()); Pembaca InputStreamReader = InputStreamReader baru (bis); XmlParser xp = XmlParser baru (pembaca); // Gunakan pemetaan default antara objek Java dan elemen Soap SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12)); envelope.parse (xp);

Variabel string mesgmenyimpan seluruh dokumen SOAP.

Sekarang, kita harus mengambil pesan dari SOAP yang telah diurai envelope. Kode berikut mengambil anak pertama di bawah Bodyelemen SOAP :

// Untuk Daftar 1 Dunia Hello Hasil String = (String) envelope.getBody (); 

Ketika diterapkan pada Hello World Listing 1, resultmengandung nilai string Hello World.

Segmen kode berikutnya mengambil cucu pertama di bawah Bodyelemen SOAP :

// Untuk Daftar 2 Dunia Hello String result = (String) envelope.getResult (); 

The SoapEnvelope.getResult()Metode nyaman mengambil nilai dari SOAP RPC pesan respon seperti Hello World di properti 2. Namun, seperti yang telah saya katakan, SOAP parser ini nilai inti kebohongan tidak dalam kemampuannya untuk mengambil string teks dari dokumen SOAP, tetapi pada kemampuannya untuk peta Elemen SOAP XML ke objek Java. Mari kita periksa bagaimana kSOAP mencapai pemetaan itu.

struktur objek kSOAP

Dalam pesan SOAP, xsi:typeatribut elemen menentukan tipe data konten elemen XML. Misalnya, 123menentukan nilai integer 123, dan 123menentukan nilai string "123".

kSOAP secara otomatis memetakan empat jenis SOAP ke jenis Java menurut daftar berikut:

Pemetaan tipe default
Jenis sabun Jenis Java
xsd:int java.lang.Integer
xsd:long java.lang.Long
xsd:string java.lang.String
xsd:boolean java.lang.Boolean