Προγραμματισμός

Πρόσβαση σε υπηρεσίες Web από ασύρματες συσκευές

Όπως ανέφερα στην πρώτη Ασύρματη Java στήλη, "Java Readies Itself for Wireless Web Services", η δυνατότητα επεξεργασίας XML αντιπροσωπεύει μία από τις βασικές απαιτήσεις για εφαρμογές ασύρματων υπηρεσιών Web. Ωστόσο, η τυπική προδιαγραφή J2ME / MIDP (Java 2 Platform, Micro Edition / Mobile Information Device Profile) δεν διαθέτει τυπικά API XML, τα οποία δεν περιλαμβάνονται ούτε στην επικείμενη προδιαγραφή MIDP 2.0. Επομένως, χρειαζόμαστε βιβλιοθήκες J2ME / CLDC (Connected Limited Device Configuration) τρίτων που μπορούν να χειριστούν XML, ειδικά εκείνα τα πρωτόκολλα XML για συγκεκριμένες υπηρεσίες Web.

Σε αυτό το άρθρο, συζητώ τον τρόπο επεξεργασίας μηνυμάτων υπηρεσιών Web χρησιμοποιώντας το πακέτο kSOAP ανοιχτού κώδικα στην πλατφόρμα J2ME / MIDP. Όπως και πολλές άλλες αρχιτεκτονικές εταιρικών υπολογιστών, οι υπηρεσίες Web περιλαμβάνουν πελάτες και διακομιστές. Όπως πολλές συζητήσεις επικεντρώνονται στον τρόπο χρήσης του J2EE (Java 2 Platform, Enterprise Edition) για την ανάπτυξη και ανάπτυξη υπηρεσιών Web από την πλευρά του διακομιστή, εστιάζω μόνο στην πλευρά του πελάτη J2ME σε αυτό το άρθρο.

Το πλεονέκτημα του σαπουνιού

Ένα σημαντικό πρωτόκολλο XML για πρόσβαση σε υπηρεσίες Web είναι το SOAP (Simple Object Access Protocol). Σε σύγκριση με τις ανταγωνιστικές τεχνολογίες, το SOAP έχει τα ακόλουθα πλεονεκτήματα:

  1. Το SOAP ορίζει περισσότερους από 40 τυπικούς τύπους δεδομένων μέσω XML Schema και επιτρέπει στους χρήστες να καθορίζουν προσαρμοσμένους τύπους δεδομένων. Αυτή η εξελιγμένη υποστήριξη τύπου δεδομένων καθιστά το SOAP μια ισχυρή και πλούσια γλώσσα για την ανταλλαγή πληροφοριών μεταξύ των σημερινών ευρέως χρησιμοποιούμενων αντικειμενοστρεφών συστημάτων.
  2. Εκτός από την ισχυρή υποστήριξη τύπου δεδομένων, το SOAP υποστηρίζει επίσης διάφορα σχήματα ανταλλαγής μηνυμάτων. Αυτά τα σχήματα περιλαμβάνουν σύγχρονες κλήσεις απομακρυσμένης διαδικασίας (RPC), ασύγχρονα μηνύματα, μηνύματα πολλαπλής διανομής (συνδρομή) και σύνθετες διαδρομές μηνυμάτων με πολλούς διαμεσολαβητές.
  3. Δεδομένου ότι το SOAP έχει αποκτήσει mainstream υποστήριξη ως πρότυπο ανταλλαγής μηνυμάτων υπηρεσιών Web, τα περισσότερα άλλα πρωτόκολλα υπηρεσιών Web πρέπει να λειτουργούν ή να δεσμεύονται με το SOAP. Για παράδειγμα, WSDL (Γλώσσα περιγραφής υπηρεσιών Web), UDDI (Καθολική περιγραφή, ανακάλυψη και ενοποίηση) και τα περισσότερα μητρώα XML υποστηρίζουν SOAP. Ψηφιακή υπογραφή XML, κρυπτογράφηση XML, SAML (Security Assertion Markup Language) και άλλα ασφαλή πρωτόκολλα XML όλα παρέχουν τυπική δέσμευση με SOAP. Κάθε πρωτόκολλο δέσμευσης παρέχει σύνταξη του δικού του ειδικού στοιχείου σε μηνύματα SOAP. Η πλήρης υποστήριξη του SOAP για χώρους ονομάτων XML διευκόλυνε τη σύνδεση με άλλα πρωτόκολλα.

Λόγω των παραπάνω πλεονεκτημάτων, το SOAP είναι ήδη το πιο διαδεδομένο πρωτόκολλο επικοινωνίας για υπηρεσίες Web. Επομένως, βασική απαίτηση για μια εφαρμογή ασύρματης υπηρεσίας Web είναι η ικανότητα κατανόησης των μηνυμάτων SOAP. Τώρα ας δούμε μερικά απλά παραδείγματα σαπουνιών. Η λίστα 1 απεικονίζει ένα απλό, γενικό μήνυμα SOAP:

Λίστα 1. Μήνυμα Hello World SOAP

  Γειά σου Κόσμε 

Το SOAP χρησιμοποιείται ευρύτερα σε RPC υπηρεσιών Ιστού. Ένα μήνυμα απόκρισης SOAP από ένα RPC υπηρεσιών Web περιέχει συνήθως τις τιμές επιστροφής μέσα σε ένα Αποτέλεσμα στοιχείο κάτω από το σαπούνι Σώμα στοιχείο. Η λίστα 2 εμφανίζει ένα απλό μήνυμα απόκρισης SOAP RPC:

Λίστα 2. Μήνυμα απάντησης Γεια σου World SOAP RPC

   Γειά σου Κόσμε 

Δεδομένου ότι πρέπει να έχουμε πρόσβαση στα μηνύματα SOAP μέσω προγραμματισμού στα προγράμματά μας, χρειαζόμαστε ένα πρόγραμμα ανάλυσης SOAP.

Τι είναι η ανάλυση SOAP;

Κάθε γενικό πρόγραμμα ανάλυσης XML με υποστήριξη χώρου ονομάτων κατανοεί τα μηνύματα SOAP και μπορεί να εξαγάγει πληροφορίες από αυτά. Θεωρητικά, μπορούμε πάντα να εξαγάγουμε πληροφορίες κειμένου από ένα μήνυμα SOAP χρησιμοποιώντας ένα γενικό πρόγραμμα ανάλυσης XML και, στη συνέχεια, να μετατρέψουμε αυτές τις συμβολοσειρές κειμένου σε αντικείμενα δεδομένων Java όταν πρέπει να τα χρησιμοποιήσουμε. Για παράδειγμα, int i = Integer.parseInt ("123"); μετατρέπει μια συμβολοσειρά κειμένου "123" σε ακέραια τιμή 123. Αλλά αυτή η μη αυτόματη μετατροπή επιβαρύνει τους προγραμματιστές εφαρμογών. Η εξαγωγή αντικειμένων δεδομένων Java απευθείας από ένα μήνυμα SOAP θα παρέχει μια καλύτερη προσέγγιση. Εισαγάγετε το πρόγραμμα ανάλυσης SOAP.

Ένας αναλυτής SOAP είναι βασισμένος σε ένα γενικό πρόγραμμα ανάλυσης XML με ειδικούς μηχανισμούς χαρτογράφησης και ανάλυσης δεδομένων κειμένου. Ένας αναλυτής SOAP κατανοεί τις πληροφορίες τύπου δεδομένων σε μηνύματα SOAP και μετατρέπει αυτόματα το μήνυμα SOAP σε αντικείμενα δεδομένων Java. Η πραγματική αξία του αναλυτή είναι ότι παρέχει διαφάνεια προγραμματισμού μεταξύ ενός προγράμματος Java και ενός μηνύματος SOAP. Ένας προγραμματιστής τροφοδοτεί απλώς αντικείμενα Java σε έναν συγγραφέα SOAP, στέλνει το μήνυμα, περιμένει την απόκριση του διακομιστή και στη συνέχεια διαβάζει αντικείμενα Java απευθείας από τον αναλυτή SOAP.

Όπως ανέφερα, το SOAP διαθέτει ένα πλούσιο σύνολο λειτουργιών. Πολλοί θεωρούν ότι η υποστήριξη ανάλυσης SOAP σε ασύρματες πλατφόρμες περιορισμένης χρήσης πόρων, όπως το J2ME / CLDC, είναι ακριβή. Υπάρχουν επίσης πρακτικές δυσκολίες:

  1. Η ελαφριά πλατφόρμα J2ME / CLDC θυσιάζει πολλές χρήσιμες τυπικές λειτουργίες Java για μέγεθος και ταχύτητα. Ως αποτέλεσμα, η πλατφόρμα J2ME / CLDC έχει περιορισμένη μόνο λειτουργικότητα συμβολοσειράς, ένα σημαντικό πρόβλημα για κάθε ασύρματο πρόγραμμα ανάλυσης Java XML.
  2. Η ανάλυση SOAP απαιτεί ο αναλυτής να διαβάσει ολόκληρο το έγγραφο στη μνήμη. Αλλά οι περισσότεροι αναλυτές J2ME / CLDC είναι γραμμικοί αναλυτές SAX αποδοτικοί στη μνήμη, οι οποίοι δεν κατασκευάζουν ποτέ μοντέλα αντικειμένων στη μνήμη.
  3. Η πλατφόρμα J2ME / CLDC δεν διαθέτει υποστήριξη για ορισμένους βασικούς τύπους δεδομένων, όπως το Φλοτέρ τύπος.

Ευτυχώς, το έργο kSOAP λύνει αυτά τα προβλήματα και παρέχει μια λύση SOAP για μικρές συσκευές.

kSOAP για τη διάσωση

Με βάση τη διάσημη ανοιχτή πηγή XML parser kXML, το Enhydra.org ξεκίνησε ένα έργο ανοιχτού κώδικα για ανάλυση SOAP σε πλατφόρμες J2ME / MIDP - το έργο kSOAP. Μέρος του έργου EnhydraME, το kSOAP γράφτηκε από μια ομάδα προγραμματιστών με επικεφαλής τον Stefan Haustein. Η Enhydra κυκλοφόρησε την πρώτη έκδοση alpha του kSOAP τον Μάιο του 2001. Μετά από ένα χρόνο ανάπτυξης, το kSOAP, τώρα στην έκδοση 1.2, υποστηρίζει ένα βασικό σύνολο λειτουργιών SOAP 1.2. Τα παραδείγματα αυτού του άρθρου και οι συζητήσεις σχετικά με την αρχιτεκτονική ισχύουν για την έκδοση 0,95 του kSOAP και μετά (βλ. Πόροι για τον πλήρη πηγαίο κώδικα). Ο κώδικας εκτελείται στο περιβάλλον MIDP. εάν είστε νέοι στην ανάπτυξη MIDP ή θέλετε να ανανεώσετε τις δεξιότητές σας, ανατρέξτε στη σειρά Michael Cymerman "Device Programming with MIDP".

Αυτό το τμήμα κώδικα αναλύει τα παραδείγματα Hello World χρησιμοποιώντας το kSOAP:

ByteArrayInputStream bis = νέο ByteArrayInputStream (mesg.getBytes ()); InputStreamReader reader = νέο InputStreamReader (bis); XmlParser xp = νέο XmlParser (αναγνώστης); // Χρησιμοποιήστε την προεπιλεγμένη αντιστοίχιση μεταξύ αντικειμένων Java και στοιχείων Soap SoapEnvelope envelope = new SoapEnvelope (νέο ClassMap (Soap.VER12)); envelope.parse (xp); 

Η μεταβλητή συμβολοσειράς μεσα αποθηκεύει ολόκληρο το έγγραφο SOAP.

Τώρα, πρέπει να ανακτήσουμε το μήνυμα από το αναλυμένο σαπούνι φάκελος. Ο ακόλουθος κωδικός ανακτά το πρώτο παιδί κάτω από το σαπούνι Σώμα στοιχείο:

// Για το Hello World List 1 αποτέλεσμα συμβολοσειράς = (String) envelope.getBody (); 

Όταν εφαρμόζεται στην Hello World List 1, αποτέλεσμα περιέχει τιμή συμβολοσειράς Γειά σου Κόσμε.

Αυτό το επόμενο τμήμα κώδικα ανακτά το πρώτο εγγόνι κάτω από το σαπούνι Σώμα στοιχείο:

// Για το Hello World List 2 αποτέλεσμα συμβολοσειράς = (String) envelope.getResult (); 

ο SoapEnvelope.getResult () Η μέθοδος ανακτά εύκολα τις τιμές από τα μηνύματα απόκρισης SOAP RPC όπως το Hello World στη λίστα 2. Ωστόσο, όπως έχω πει, η βασική τιμή ενός αναλυτή SOAP δεν έγκειται στην ικανότητά του να ανακτά συμβολοσειρές κειμένου από ένα έγγραφο SOAP, αλλά στην ικανότητά του να χαρτογραφεί το SOAP Στοιχεία XML σε αντικείμενα Java. Ας εξετάσουμε πώς το kSOAP επιτυγχάνει αυτή τη χαρτογράφηση.

δομή αντικειμένων kSOAP

Σε ένα μήνυμα SOAP, ένα στοιχείο xsi: τύπος Το χαρακτηριστικό καθορίζει τον τύπο δεδομένων του περιεχομένου ενός στοιχείου XML. Για παράδειγμα, 123 καθορίζει μια ακέραια τιμή 123, και 123 καθορίζει μια τιμή συμβολοσειράς του "123".

Το kSOAP αντιστοιχίζει αυτόματα τέσσερις τύπους SOAP σε τύπους Java σύμφωνα με την ακόλουθη λίστα:

Προεπιλεγμένη αντιστοίχιση τύπου
Τύπος σαπουνιούΤύπος Java
xsd: intjava.lang.Integer
xsd: μεγάλοjava.lang.Long
xsd: συμβολοσειράjava.lang.String
xsd: booleanjava.lang.Boolean
$config[zx-auto] not found$config[zx-overlay] not found