Πρωτόκολλο SOAP και Υπηρεσίες Ιστού. XML υπηρεσίες web. Πρωτόκολλο SOAP
Ο τίτλος του θέματος είναι πραγματικά μια ερώτηση, γιατί... Ο ίδιος δεν ξέρω τι είναι και για πρώτη φορά θα προσπαθήσω να το δουλέψω στο πλαίσιο αυτού του άρθρου. Το μόνο πράγμα που μπορώ να εγγυηθώ είναι ότι ο κώδικας που παρουσιάζεται παρακάτω θα λειτουργήσει, αλλά οι φράσεις μου θα είναι μόνο υποθέσεις και εικασίες για το πώς εγώ ο ίδιος καταλαβαίνω όλα αυτά. Λοιπόν πάμε...
Εισαγωγή
Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως RPC (Remote Procedure Calling). Παραδείγματα περιλαμβάνουν τεχνολογίες CORBA και για Java - RMI (Remote Method Invoking). Και όλα δείχνουν να είναι καλά σε αυτούς, ειδικά στην CORBA, γιατί... Μπορείτε να εργαστείτε με αυτό σε οποιαδήποτε γλώσσα προγραμματισμού, αλλά κάτι έλειπε ακόμα. Πιστεύω ότι το μειονέκτημα της CORBA είναι ότι λειτουργεί μέσω κάποιων δικών της πρωτόκολλα δικτύουαντί απλό HTTP, το οποίο θα χωράει σε οποιοδήποτε τείχος προστασίας. Η ιδέα της διαδικτυακής υπηρεσίας ήταν να δημιουργήσει ένα RPC που θα εισαγόταν σε πακέτα HTTP. Έτσι ξεκίνησε η ανάπτυξη του προτύπου. Ποιες είναι οι βασικές έννοιες αυτού του προτύπου:- ΣΑΠΟΥΝΙ. Πριν καλέσετε μια απομακρυσμένη διαδικασία, πρέπει να περιγράψετε αυτήν την κλήση αρχείο XML e Μορφή SOAP. Το SOAP είναι απλώς μια από τις πολλές σημάνσεις XML που χρησιμοποιούνται σε υπηρεσίες web. Όλα όσα θέλουμε να στείλουμε κάπου μέσω HTTP μετατρέπονται πρώτα σε περιγραφή XML SOAP, στη συνέχεια γεμίζονται σε ένα πακέτο HTTP και αποστέλλονται σε άλλον υπολογιστή στο δίκτυο μέσω TCP/IP.
- WSDL. Υπάρχει μια διαδικτυακή υπηρεσία, π.χ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία web και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο XML, το οποίο έχει διαφορετική μορφή, δηλαδή το WSDL. Εκείνοι. Το WSDL είναι απλώς ένα αρχείο XML που περιγράφει μια υπηρεσία Ιστού και τίποτα περισσότερο.
Γενική προσέγγιση
Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η διαδικτυακή μας υπηρεσία και μερικές φορές ονομάζεται τελικό σημείο (όπως, τελικό σημείο, όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:- Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
- Εφαρμογή αυτής της διεπαφής
- Εκκινήστε την υπηρεσία web μας
- Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως την επιθυμητή μέθοδο υπηρεσίας web
Υπηρέτης
Ας ξεκινήσουμε το IDEA και ας δημιουργήσουμε νέο έργο Δημιουργία νέου έργου. Ας υποδείξουμε το όνομα HelloWebServiceκαι πατήστε το κουμπί Επόμενο, μετά κουμπί Φινίρισμα. Σε φάκελο srcας δημιουργήσουμε ένα πακέτο ru.javarush.ws. Σε αυτό το πακέτο θα δημιουργήσουμε τη διεπαφή HelloWebService: πακέτο ru. javarush. ws; // αυτοί είναι σχολιασμοί, δηλ. ένας τρόπος να επισημάνουμε τις τάξεις και τις μεθόδους μας, // σε σχέση με την τεχνολογία υπηρεσιών webεισαγωγή javax. jws. WebMethod; εισαγωγή javax. jws. WebService; εισαγωγή javax. jws. σαπούνι. SOAPBinding; // λέμε ότι η διεπαφή μας θα λειτουργεί ως υπηρεσία web@WebService // λέμε ότι η υπηρεσία Ιστού θα χρησιμοποιηθεί για την κλήση μεθόδων@SOAPBinding (στυλ = SOAPBinding. Στυλ. RPC) δημόσια διεπαφή HelloWebService ( // λέμε ότι αυτή η μέθοδος μπορεί να κληθεί από απόσταση@WebMethod δημόσια συμβολοσειρά getHelloString(Όνομα συμβολοσειράς) ; ) Σε αυτόν τον κώδικα, οι κλάσεις WebService και WebMethod είναι οι λεγόμενοι σχολιασμοί και δεν κάνουν τίποτα εκτός από την επισήμανση της διεπαφής μας και της μεθόδου της ως υπηρεσίας web. Το ίδιο ισχύει και για την κατηγορία SOAPBinding. Η μόνη διαφορά είναι ότι το SOAPBinding είναι ένας σχολιασμός με παραμέτρους. Σε αυτήν την περίπτωση, η παράμετρος στυλ χρησιμοποιείται με μια τιμή που υποδεικνύει ότι η υπηρεσία web δεν θα λειτουργεί μέσω μηνυμάτων εγγράφων, αλλά ως κλασικό RPC, π.χ. για να καλέσετε μια μέθοδο. Ας εφαρμόσουμε τη λογική διεπαφής μας και ας δημιουργήσουμε μια κλάση HelloWebServiceImpl στο πακέτο μας. Παρεμπιπτόντως, σημειώνω ότι ο τερματισμός μιας κλάσης με Impl είναι μια σύμβαση στην Java, σύμφωνα με την οποία η υλοποίηση των διεπαφών ορίζεται έτσι (Impl - από τη λέξη υλοποίηση, δηλ. υλοποίηση). Αυτό δεν είναι απαίτηση και είστε ελεύθεροι να ονομάσετε την τάξη όπως θέλετε, αλλά οι καλοί τρόποι το απαιτούν: πακέτο ru. javarush. ws; // ο ίδιος σχολιασμός όπως όταν περιγράφεται η διεπαφή,εισαγωγή javax. jws. WebService; // αλλά εδώ χρησιμοποιείται με την παράμετρο endpointInterface, // υποδεικνύοντας πλήρες όνομακλάση διεπαφής της διαδικτυακής μας υπηρεσίας@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") δημόσια κλάση HelloWebServiceImpl υλοποιεί το HelloWebService ( @Override public String getHelloString (Όνομα συμβολοσειράς) ( // απλώς επιστρέψτε τον χαιρετισμόεπιστροφή "Γεια, " + όνομα + "!" ; ) ) Ας ξεκινήσουμε την υπηρεσία ιστού μας ως ανεξάρτητος διακομιστής, π.χ. χωρίς τη συμμετοχή οποιουδήποτε διακομιστή Tomcat και εφαρμογών (αυτό είναι ένα θέμα για ξεχωριστή συζήτηση). Για να το κάνετε αυτό, στη δομή του έργου στο φάκελο srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.endpoint και σε αυτό θα δημιουργήσουμε μια κλάση HelloWebServicePublisher με την κύρια μέθοδο: πακέτο ru. javarush. τελικό σημείο? // κλάση για τη λειτουργία ενός διακομιστή web με υπηρεσίες webεισαγωγή javax. xml. ws. Τελικό σημείο; // κατηγορία της διαδικτυακής μας υπηρεσίαςεισαγωγή ru. javarush. ws. HelloWebServiceImpl; δημόσια τάξη HelloWebServicePublisher ( δημόσιο static void main (String... args) ( // εκκίνηση του διακομιστή web στη θύρα 1986 // και στη διεύθυνση που καθορίζεται στο πρώτο όρισμα, // εκκίνηση της υπηρεσίας Ιστού που μεταβιβάστηκε στο δεύτερο όρισμαΤελικό σημείο. δημοσιεύω ( "http://localhost:1986/wss/hello", νέο HelloWebServiceImpl () ); ) ) Τώρα ας εκτελέσουμε αυτήν την κλάση κάνοντας κλικ Shift+F10. Δεν θα εμφανιστεί τίποτα στην κονσόλα, αλλά ο διακομιστής εκτελείται. Μπορείτε να το επαληθεύσετε πληκτρολογώντας τη γραμμή http://localhost:1986/wss/hello?wsdl στο πρόγραμμα περιήγησής σας. Η σελίδα που ανοίγει, αφενός, αποδεικνύει ότι έχουμε έναν διακομιστή web (http://) που εκτελείται στη θύρα 1986 στον υπολογιστή μας (localhost) και, αφετέρου, δείχνει μια περιγραφή WSDL της υπηρεσίας web μας. Εάν διακόψετε την εφαρμογή, η περιγραφή δεν θα είναι διαθέσιμη, όπως και η ίδια η υπηρεσία web, επομένως δεν θα το κάνουμε αυτό, αλλά θα προχωρήσουμε στη σύνταξη του πελάτη.Πελάτης
Στο φάκελο του έργου srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.client , και σε αυτό την κλάση HelloWebServiceClient με την κύρια μέθοδο: πακέτο ru. javarush. πελάτης; // απαιτείται για να λάβετε την περιγραφή wsdl και μέσω αυτής // πρόσβαση στην ίδια την υπηρεσία webεισαγωγή java. καθαρά. URL? // Αυτή η εξαίρεση θα προκύψει κατά την εργασία με ένα αντικείμενο URLεισαγωγή java. καθαρά. MalformedURLException; // κλάσεις για ανάλυση xml με περιγραφή wsdl // και μεταβείτε στην ετικέτα υπηρεσίας σε αυτήνεισαγωγή javax. xml. χώρο ονομάτων. QName; εισαγωγή javax. xml. ws. Υπηρεσία; // διεπαφή της υπηρεσίας ιστού μας (χρειαζόμαστε περισσότερα)εισαγωγή ru. javarush. ws. HelloWebService; δημόσια κλάση HelloWebServiceClient ( δημόσιο στατικό κενό main (String args) ρίχνει MalformedURLException ( // δημιουργήστε έναν σύνδεσμο προς την περιγραφή wsdl URL διεύθυνσης URL= νέα διεύθυνση URL ( "http://localhost:1986/wss/hello?wsdl") ; // Εξετάζουμε τις παραμέτρους του επόμενου κατασκευαστή στην πρώτη ετικέτα της περιγραφής WSDL - ορισμοί // κοιτάξτε το 1ο όρισμα στο χαρακτηριστικό targetNamespace // κοιτάξτε το 2ο όρισμα χαρακτηριστικό όνομα QName qname = νέο QName ("http://ws.site/" , "HelloWebServiceImplService" ); // Τώρα μπορούμε να φτάσουμε στην ετικέτα υπηρεσίας περιγραφή wsdl, Service service = Service. δημιουργία (url, qname) ; // και μετά μέχρι την ετικέτα θύρας που είναι ένθετη σε αυτήν, έτσι ώστε // λάβετε έναν σύνδεσμο προς ένα αντικείμενο υπηρεσίας ιστού που είναι απομακρυσμένο από εμάς HelloWebService γεια = υπηρεσία. getPort(HelloWebService.class); // Ωραία! Τώρα μπορείτε να καλέσετε την απομακρυσμένη μέθοδοΣύστημα. έξω. println (γεια. getHelloString ("JavaRush") ); ) ) Έδωσα τα μέγιστα σχόλια για τον κωδικό στην καταχώριση. Δεν έχω τίποτα να προσθέσω, οπότε ας τρέξουμε (Shift+F10). Θα πρέπει να δούμε το κείμενο στην κονσόλα: Γεια σου, JavaRush! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.συμπέρασμα
Αυτό το θέμα παρείχε μια σύντομη εκδρομή στις υπηρεσίες Ιστού. Για άλλη μια φορά, θα πω ότι πολλά από αυτά που έγραψα είναι η εικασία μου ως προς το πώς λειτουργεί, και επομένως δεν πρέπει να με εμπιστεύεστε πολύ. Θα ήμουν ευγνώμων αν με διορθώσουν γνώστες, γιατί τότε κάτι θα μάθω. UPD.- Φροντιστήριο
Γεια σε όλους!
Έτυχε ότι μέσα ΠρόσφαταΆρχισα να αναπτύσσω υπηρεσίες web. Αλλά σήμερα το θέμα δεν αφορά εμένα, αλλά για το πώς μπορούμε να γράψουμε τη δική μας XML Web Service με βάση το πρωτόκολλο SOAP 1.2.
Ελπίζω ότι αφού διαβάσετε το θέμα θα είστε σε θέση:
- γράψτε τη δική σας εφαρμογή διακομιστή μιας εφαρμογής web.
- γράψτε τη δική σας εφαρμογή πελάτη μιας διαδικτυακής εφαρμογής.
- γράψτε τη δική σας περιγραφή της υπηρεσίας Ιστού (WSDL).
- αποστολή των συστοιχιών πελάτη του ίδιου τύπου δεδομένων στον διακομιστή.
1 Δήλωση προβλήματος
1.1 Όρια
Στην αρχή προτείνω να ασχοληθούμε με το αποτέλεσμα που θα πετύχουμε στο τέλος του θέματος. Όπως ανακοινώθηκε παραπάνω, θα γράψουμε μια υπηρεσία για την αποστολή μηνυμάτων SMS και πιο συγκεκριμένα, θα λάβουμε μηνύματα από διαφορετικές πηγέςμέσω πρωτοκόλλου SOAP. Μετά από αυτό, θα εξετάσουμε σε ποια μορφή έρχονται στον διακομιστή. Η ίδια η διαδικασία της ουράς μηνυμάτων για περαιτέρω αποστολή στον πάροχο, δυστυχώς, ξεφεύγει από το πεδίο αυτής της ανάρτησηςγια ΠΟΛΛΟΥΣ λογους.1.2 Ποια δεδομένα θα αλλάξουμε;
Ωραία, αποφασίσαμε για τα όρια! Το επόμενο βήμα που πρέπει να γίνει είναι να αποφασίσουμε ποια δεδομένα θα ανταλλάξουμε μεταξύ του διακομιστή και του πελάτη. Σε αυτό το θέμα, προτείνω να μην χωρίσετε τις τρίχες για πολύ καιρό και να απαντήσετε αμέσως στις κύριες ερωτήσεις για τον εαυτό σας:- Ποια ελάχιστα δεδομένα πρέπει να αποστέλλονται στον διακομιστή για να σταλεί ένα μήνυμα SMS σε έναν συνδρομητή;
- Ποια ελάχιστα δεδομένα πρέπει να αποστέλλονται από τον διακομιστή για να ικανοποιηθούν οι ανάγκες του πελάτη;
- αριθμός κινητού τηλεφώνου και
- κείμενο του μηνύματος SMS.
- ημερομηνία αποστολής του μηνύματος SMS.
- Τύπος μηνύματος.
Κι όμως, κάτι ξέχασα! Αν σκεφτούμε λίγο περισσότερο, αξίζει να σημειωθεί ότι ο πελάτης μπορεί να στείλει είτε ένα μήνυμα SMS είτε έναν αριθμό από αυτά στον διακομιστή κάθε φορά. Με άλλα λόγια, ένα πακέτο δεδομένων μπορεί να περιέχει από ένα έως άπειρα μηνύματα.
Ως αποτέλεσμα, καταλαβαίνουμε ότι για να στείλουμε ένα μήνυμα SMS χρειαζόμαστε τα ακόλουθα δεδομένα:
- Αριθμός κινητού τηλεφώνου,
- κείμενο μηνύματος SMS,
- ώρα αποστολής του μηνύματος SMS στον συνδρομητή,
- τύπο μηνύματος.
Απαντήσαμε στην πρώτη ερώτηση, τώρα πρέπει να απαντήσουμε στη δεύτερη ερώτηση. Και ίσως επιτρέψω στον εαυτό μου να μπλέξω λίγο. Επομένως, από τον διακομιστή θα στείλουμε μόνο Boolean δεδομένα, η έννοια των οποίων έχει την εξής σημασία:
- TRUE – το πακέτο έφτασε με επιτυχία στον διακομιστή, πέρασε τον έλεγχο ταυτότητας και μπήκε στην ουρά για αποστολή στον πάροχο SMS
- ΛΑΘΟΣ – σε όλες τις άλλες περιπτώσεις
Αυτό ολοκληρώνει την περιγραφή της δήλωσης προβλήματος! Και τέλος, ας πάμε στο διασκεδαστικό μέρος - ας καταλάβουμε τι περίεργο θηρίο είναι αυτό το ΣΑΠΟΥΝΙ!
2 Τι είναι το SOAP;
Γενικά, αρχικά δεν σκόπευα να γράψω τίποτα για το τι είναι το SOAP και ήθελα να περιοριστώ σε συνδέσμους προς τον ιστότοπο w3.org με τις απαραίτητες προδιαγραφές, καθώς και συνδέσμους στη Wikipedia. Αλλά στο τέλος αποφάσισα να γράψω μια σύντομη σημείωση για αυτό το πρωτόκολλο.Και θα ξεκινήσω την ιστορία μου με το γεγονός ότι αυτό το πρωτόκολλο ανταλλαγής δεδομένων ανήκει σε ένα υποσύνολο πρωτοκόλλων που βασίζονται στο λεγόμενο παράδειγμα RPC (Remote Procedure Call), ο αντίποδας του οποίου είναι το REST (Representational State Transfer). Μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό στη Wikipedia, οι σύνδεσμοι προς τα άρθρα βρίσκονται στο τέλος του θέματος. Από αυτά τα άρθρα πρέπει να κατανοήσουμε τα εξής: «Η προσέγγιση RPC σάς επιτρέπει να χρησιμοποιείτε έναν μικρό αριθμό πόρων δικτύου με μεγάλο ποσόμεθόδους και πολύπλοκο πρωτόκολλο. Με την προσέγγιση REST, ο αριθμός των μεθόδων και η πολυπλοκότητα του πρωτοκόλλου είναι αυστηρά περιορισμένοι, πράγμα που σημαίνει ότι ο αριθμός των μεμονωμένων πόρων μπορεί να είναι μεγάλος». Δηλαδή, σε σχέση με εμάς, αυτό σημαίνει ότι στην περίπτωση της προσέγγισης RPC στον ιστότοπο θα υπάρχει πάντα μία είσοδος (σύνδεσμος) στην υπηρεσία και ποια διαδικασία να καλέσουμε για την επεξεργασία των εισερχόμενων δεδομένων που μεταφέρουμε μαζί με τα δεδομένα, ενώ με την προσέγγιση REST στον ιστότοπό μας έχει πολλές εισόδους (συνδέσμους), καθεμία από τις οποίες δέχεται και επεξεργάζεται μόνο ορισμένα δεδομένα. Αν κάποιος που διαβάζει ξέρει πώς να εξηγήσει τη διαφορά σε αυτές τις προσεγγίσεις ακόμα πιο απλά, φροντίστε να γράψει στα σχόλια!
Το επόμενο πράγμα που πρέπει να γνωρίζουμε για το SOAP είναι ότι αυτό το πρωτόκολλο χρησιμοποιεί το ίδιο XML ως μεταφορά, το οποίο αφενός είναι πολύ καλό, επειδή αμέσως το οπλοστάσιό μας λαμβάνει την πλήρη ισχύ μιας στοίβας τεχνολογιών που βασίζονται σε δεδομένη γλώσσασήμανσης, συγκεκριμένα XML-Schema - μια γλώσσα για την περιγραφή της δομής ενός εγγράφου XML (ευχαριστώ τη Wikipedia!), η οποία επιτρέπει την αυτόματη επικύρωση των δεδομένων που λαμβάνονται από τον διακομιστή από τους πελάτες.
Και έτσι, τώρα γνωρίζουμε ότι το SOAP είναι ένα πρωτόκολλο που χρησιμοποιείται για την υλοποίηση κλήσεων απομακρυσμένης διαδικασίας και χρησιμοποιεί την XML ως μεταφορά! Εάν διαβάσετε το άρθρο στη Wikipedia, μπορείτε επίσης να μάθετε από εκεί ότι μπορεί να χρησιμοποιηθεί πάνω από οποιοδήποτε πρωτόκολλο επίπεδο εφαρμογής, και όχι μόνο σε συνδυασμό με HTTP (δυστυχώς, σε αυτό το θέμα θα εξετάσουμε μόνο το SOAP έναντι του HTTP). Και ξέρεις τι μου αρέσει περισσότερο σε όλο αυτό; Εάν δεν υπάρχουν εικασίες, τότε θα δώσω μια υπόδειξη - SOAP!... Ακόμα δεν υπάρχουν εικασίες;... Είστε σίγουροι ότι διαβάσατε το άρθρο στη Wikipedia;... Γενικά, δεν θα σας βασανίσω περαιτέρω. Επομένως, θα πάω κατευθείαν στην απάντηση: "SOAP (από το αγγλικό πρωτόκολλο πρόσβασης απλού αντικειμένου - απλό πρωτόκολλοπρόσβαση σε αντικείμενα· μέχρι τις προδιαγραφές 1.2)". Το πιο αξιοσημείωτο σε αυτή τη γραμμή είναι με πλάγιους χαρακτήρες! Δεν ξέρω τι συμπεράσματα έβγαλες από όλα αυτά, αλλά βλέπω το εξής - αφού αυτό το πρωτόκολλο δεν μπορεί με κανέναν τρόπο να ονομαστεί "απλό" (και προφανώς ακόμη και το w3 συμφωνεί με αυτό), τότε από την έκδοση 1.2 σταμάτησε να αποκρυπτογραφείται με κάποιο τρόπο ! Και έγινε γνωστό ως SOAP, just SOAP, τελεία.
Λοιπόν, εντάξει, με συγχωρείτε, παρεκτράπηκα λίγο. Όπως έγραψα νωρίτερα, η XML χρησιμοποιείται ως μεταφορά και τα πακέτα που ταξιδεύουν μεταξύ του πελάτη και του διακομιστή ονομάζονται φάκελοι SOAP. Αν σκεφτείτε τη γενική δομή του φακέλου, θα σας φανεί πολύ οικείο, γιατί... μοιάζει με τη δομή μιας σελίδας HTML. Έχει ένα κύριο τμήμα - Περιτυλίσσω, που περιλαμβάνει ενότητες Επί κεφαλήςΚαι Σώμα, ή Σφάλμα. ΣΕ Σώμαδιαβιβάζονται δεδομένα και αποτελεί υποχρεωτικό τμήμα του φακέλου, ενώ Επί κεφαλήςείναι προαιρετική. ΣΕ Επί κεφαλήςμπορεί να μεταδοθεί εξουσιοδότηση ή οποιαδήποτε άλλα δεδομένα που δεν σχετίζονται άμεσα με τα δεδομένα εισόδου των διαδικασιών της υπηρεσίας Ιστού. Σχετικά με Σφάλμαδεν υπάρχει τίποτα ιδιαίτερο να πούμε, εκτός από το ότι έρχεται στον πελάτη από τον διακομιστή σε περίπτωση σφαλμάτων.
Εδώ τελειώνει η ιστορία της κριτικής μου σχετικά με το πρωτόκολλο SOAP (θα εξετάσουμε τους ίδιους τους φακέλους και τη δομή τους με περισσότερες λεπτομέρειες όταν ο πελάτης και ο διακομιστής μας τελικά μάθουν να τα εκτελούν μεταξύ τους) και ξεκινά μια νέα - σχετικά με το συνοδευτικό SOAP που ονομάζεται WSDL (Διαδικτυακές υπηρεσίεςΓλώσσα περιγραφής). Ναι, ναι, αυτό ακριβώς είναι το πράγμα που φοβίζει τους περισσότερους από εμάς ακόμη και να προσπαθήσουμε να πάρουμε και να εφαρμόσουμε το API μας στο αυτό το πρωτόκολλο. Ως αποτέλεσμα, συνήθως ανακαλύπτουμε ξανά τον τροχό μας με JSON ως μεταφορά. Τι είναι λοιπόν το WSDL; Η WSDL είναι μια γλώσσα για την περιγραφή των διαδικτυακών υπηρεσιών και την πρόσβαση σε αυτές, με βάση Γλώσσα XML(γ) Βικιπαίδεια. Εάν αυτός ο ορισμός δεν σας καθιστά σαφές ολόκληρο το ιερό νόημα αυτής της τεχνολογίας, τότε θα προσπαθήσω να το περιγράψω με δικά μου λόγια!
Το WSDL έχει σχεδιαστεί για να επιτρέπει στους πελάτες μας να επικοινωνούν κανονικά με τον διακομιστή. Για να γίνει αυτό, το αρχείο με την επέκταση "*.wsdl" περιγράφει τις ακόλουθες πληροφορίες:
- Ποιοι χώροι ονομάτων χρησιμοποιήθηκαν;
- Ποια σχήματα δεδομένων χρησιμοποιήθηκαν;
- Τι είδους μηνύματα αναμένει η υπηρεσία web από τους πελάτες;
- Ποια δεδομένα ανήκουν σε ποιες διαδικασίες διαδικτυακής υπηρεσίας,
- Ποιες διαδικασίες περιλαμβάνει η υπηρεσία web;
- Πώς πρέπει ο πελάτης να καλεί τις διαδικασίες υπηρεσιών web,
- Σε ποια διεύθυνση πρέπει να αποστέλλονται οι κλήσεις πελατών;
3 Εισαγωγή στο XML-Schema
Τώρα γνωρίζουμε πολλά για το τι είναι το SOAP, τι υπάρχει μέσα του και έχουμε μια επισκόπηση της στοίβας τεχνολογίας που το περιβάλλει. Δεδομένου ότι, πρώτα απ 'όλα, το SOAP είναι μια μέθοδος αλληλεπίδρασης μεταξύ ενός πελάτη και ενός διακομιστή και η γλώσσα σήμανσης XML χρησιμοποιείται ως μεταφορά για αυτό, σε αυτήν την ενότητα θα καταλάβουμε λίγο πώς γίνεται η αυτόματη επικύρωση δεδομένων χρησιμοποιώντας σχήματα XML.Το κύριο καθήκον του διαγράμματος είναι να περιγράψει τη δομή των δεδομένων που πρόκειται να επεξεργαστούμε. Όλα τα δεδομένα σε σχήματα XML χωρίζονται σε απλός(κλιμακωτός) και συγκρότημα(δομές) τύπους. Οι απλοί τύποι περιλαμβάνουν τους ακόλουθους τύπους:
- γραμμή,
- αριθμός,
- δυαδική τιμή,
- ημερομηνία της.
Προτείνω να μην πάτε μακριά και να γράψετε ένα σχήμα XML για το μήνυμα SMS μας! Ακολουθεί η xml περιγραφή του μηνύματος SMS:
Το διάγραμμα σύνθετου τύπου μας θα μοιάζει με αυτό:
Αυτή η καταχώρηση έχει ως εξής: Έχουμε μια μεταβλητή " μήνυμα"τύπος" Μήνυμα"και υπάρχει ένας πολύπλοκος τύπος που ονομάζεται " Μήνυμα", το οποίο αποτελείται από ένα διαδοχικό σύνολο στοιχείων" τηλέφωνο"τύπος σειρά, « κείμενο"τύπος σειρά, « ημερομηνία"τύπος ημερομηνία ώρα, « τύπος"τύπος δεκαδικός. Αυτοί οι τύποι είναι απλοί και έχουν ήδη οριστεί στην περιγραφή του σχήματος. Συγχαρητήρια! Μόλις γράψαμε το πρώτο μας σχήμα XML!
Νομίζω ότι η έννοια των στοιχείων " στοιχείο" Και " σύνθετος τύπος"Όλα έχουν γίνει λίγο-πολύ ξεκάθαρα σε εσάς, επομένως δεν θα επικεντρωθούμε πλέον σε αυτά και ας περάσουμε κατευθείαν στο στοιχείο του συνθέτη" αλληλουχία" Όταν χρησιμοποιούμε το στοιχείο συνθέτη " αλληλουχία«Σας ενημερώνουμε ότι τα στοιχεία που περιλαμβάνονται σε αυτό πρέπει πάντα να βρίσκονται με τη σειρά που καθορίζεται στο διάγραμμα και όλα είναι υποχρεωτικά. Αλλά μην απελπίζεστε! Υπάρχουν δύο ακόμη στοιχεία συνθέτη στα σχήματα XML: " επιλογή" Και " όλα" συνθέτης" επιλογή" ανακοινώνει ότι πρέπει να υπάρχει ένα από τα στοιχεία που αναφέρονται σε αυτό και ο συνθέτης " όλα» – οποιοσδήποτε συνδυασμός των αναφερόμενων στοιχείων.
Όπως θυμάστε, στην πρώτη ενότητα του θέματος συμφωνήσαμε ότι από ένα έως άπειρα μηνύματα SMS μπορούν να μεταδοθούν σε πακέτο. Επομένως, προτείνω να κατανοήσουμε πώς δηλώνονται τέτοια δεδομένα στο σχήμα XML. Η γενική δομή του πακέτου μπορεί να μοιάζει με αυτό:
Το διάγραμμα για έναν τόσο σύνθετο τύπο θα μοιάζει με αυτό:
Το πρώτο μπλοκ περιέχει τη γνωστή δήλωση του μιγαδικού τύπου " Μήνυμα" Αν προσέξατε, τότε σε κάθε απλό τύπο που περιλαμβάνεται στο " Μήνυμα", προστέθηκαν νέα διευκρινιστικά χαρακτηριστικά " minΣυμβαίνει" Και " maxOccurs" Όπως μπορείτε να μαντέψετε από το όνομα, το πρώτο ( minΣυμβαίνει) υποδεικνύει ότι αυτή η ακολουθία πρέπει να περιέχει τουλάχιστον ένα στοιχείο τύπου " τηλέφωνο», « κείμενο», « ημερομηνία" Και " τύπος", ενώ το επόμενο ( maxOccurs) το χαρακτηριστικό μας δηλώνει ότι υπάρχει το πολύ ένα τέτοιο στοιχείο στην ακολουθία μας. Ως αποτέλεσμα, όταν γράφουμε τα δικά μας σχήματα για οποιαδήποτε δεδομένα, μας δίνεται η ευρύτερη επιλογή για το πώς να τα διαμορφώσουμε!
Το δεύτερο μπλοκ του διαγράμματος δηλώνει το στοιχείο " λίστα μηνυμάτων"τύπος" MessageList" Είναι σαφές ότι " MessageList"είναι ένας σύνθετος τύπος που περιέχει τουλάχιστον ένα στοιχείο" μήνυμα», αλλά ο μέγιστος αριθμός τέτοιων στοιχείων δεν είναι περιορισμένος!
4 Γράψτε το WSDL σας
Θυμάστε ότι το WSDL είναι η διαδικτυακή μας υπηρεσία; Ελπίζω να θυμάσαι! Καθώς το γράφουμε, η μικρή μας υπηρεσία ιστού θα λειτουργεί σε αυτό. Ως εκ τούτου, προτείνω να μην μπερδεύουμε.Γενικά, για να λειτουργούν όλα σωστά για εμάς, πρέπει να μεταφέρουμε ένα αρχείο WSDL με τον σωστό τύπο MIME στον πελάτη. Για να το κάνετε αυτό, θα πρέπει να ρυθμίσετε τις παραμέτρους του διακομιστή ιστού σας ανάλογα, δηλαδή, να ορίσετε τον τύπο MIME για αρχεία με την επέκταση "*.wsdl" στην ακόλουθη γραμμή:
Εφαρμογή/wsdl+xml
Αλλά στην πράξη, συνήθως έστελνα την κεφαλίδα HTTP μέσω PHP " κείμενο/xml»:
Header("Content-Type: text/xml; charset=utf-8");
και όλα δούλεψαν τέλεια!
Θέλω να σας προειδοποιήσω αμέσως ότι η απλή διαδικτυακή μας υπηρεσία θα έχει μια μάλλον εντυπωσιακή περιγραφή, οπότε μην ανησυχείτε, γιατί... Το μεγαλύτερο μέρος του κειμένου είναι υποχρεωτικό νερό και, αφού το γράψετε μία φορά, μπορείτε να το αντιγράφετε συνεχώς από τη μια υπηρεσία web στην άλλη!
Δεδομένου ότι το WSDL είναι XML, πρέπει να γράψετε για αυτό απευθείας στην πρώτη γραμμή. Το ριζικό στοιχείο του αρχείου πρέπει πάντα να ονομάζεται " ορισμοί»:
Συνήθως, το WSDL αποτελείται από 4-5 κύρια μπλοκ. Το πρώτο μπλοκ είναι ο ορισμός μιας διαδικτυακής υπηρεσίας ή, με άλλα λόγια, το σημείο εισόδου.
Λέει εδώ ότι έχουμε μια υπηρεσία που ονομάζεται - " SmsService" Καταρχήν, όλα τα ονόματα στο αρχείο WSDL μπορούν να αλλάξουν από εσάς σε ό,τι θέλετε, επειδή δεν παίζουν κανέναν απολύτως ρόλο.
Μετά από αυτό ανακοινώνουμε ότι στην υπηρεσία ιστού μας " SmsService"Υπάρχει ένα σημείο εισόδου ("port") που ονομάζεται " SmsServicePort" Σε αυτό το σημείο εισόδου θα αποστέλλονται όλα τα αιτήματα από τους πελάτες στον διακομιστή. Και υποδείξτε στο στοιχείο " διεύθυνση» σύνδεσμος προς το αρχείο χειριστή που θα δέχεται αιτήματα.
Αφού ορίσουμε την υπηρεσία web και καθορίσουμε το σημείο εισόδου για αυτήν, πρέπει να δεσμεύσουμε τις υποστηριζόμενες διαδικασίες σε αυτήν:
Για να γίνει αυτό, παραθέτει ποιες λειτουργίες και με ποια μορφή θα καλούνται. Εκείνοι. για λιμάνι" SmsServicePort"ένα δεσμευτικό ορίζεται κάτω από το όνομα" SmsServiceBinding", το οποίο έχει τύπο κλήσης" rpc"και το HTTP χρησιμοποιείται ως πρωτόκολλο μετάδοσης. Έτσι, υποδείξαμε εδώ ότι θα πραγματοποιήσουμε μια κλήση RPC μέσω HTTP. Μετά από αυτό περιγράφουμε ποιες διαδικασίες ( λειτουργία) υποστηρίζονται στην υπηρεσία web. Θα υποστηρίξουμε μόνο μία διαδικασία - " αποστολή SMS" Μέσω αυτής της διαδικασίας τα υπέροχα μηνύματά μας θα σταλούν στον διακομιστή! Αφού δηλωθεί η διαδικασία, είναι απαραίτητο να υποδειχθεί με ποια μορφή θα διαβιβαστούν τα δεδομένα. Σε αυτήν την περίπτωση, υποδεικνύεται ότι θα χρησιμοποιηθούν τυπικοί φάκελοι SOAP.
Μετά από αυτό, πρέπει να συνδέσουμε τη διαδικασία σε μηνύματα:
Για να γίνει αυτό, διευκρινίζουμε ότι το δέσιμο μας είναι τύπου " SmsServicePortType"και στο στοιχείο" portType«Με το όνομα του ίδιου τύπου υποδεικνύουμε τη σύνδεση των διαδικασιών σε μηνύματα. Ετσι, εισερχόμενο μήνυμα(από πελάτη σε διακομιστή) θα ονομάζεται " sendSmsRequest", και εξερχόμενη (από διακομιστή σε πελάτη) " sendSmsResponse" Όπως όλα τα ονόματα στο WSDL, τα ονόματα των εισερχόμενων και εξερχόμενων μηνυμάτων είναι αυθαίρετα.
Τώρα πρέπει να περιγράψουμε τα ίδια τα μηνύματα, δηλ. εισερχόμενες και εξερχόμενες:
Για να γίνει αυτό προσθέτουμε τα στοιχεία " μήνυμα"με ονόματα" sendSmsRequest" Και " sendSmsResponse"αντίστοιχα. Σε αυτά υποδεικνύουμε ότι η είσοδος πρέπει να είναι ένας φάκελος του οποίου η δομή αντιστοιχεί στον τύπο δεδομένων " Αίτηση" Μετά από αυτό επιστρέφεται ένας φάκελος από τον διακομιστή που περιέχει τον τύπο δεδομένων - " Απάντηση».
Τώρα πρέπει να κάνουμε λίγο - να προσθέσουμε μια περιγραφή αυτών των τύπων στο αρχείο μας WSDL! Και πώς πιστεύετε ότι το WSDL περιγράφει τα εισερχόμενα και τα εξερχόμενα δεδομένα; Νομίζω ότι έχετε ήδη καταλάβει τα πάντα εδώ και πολύ καιρό και είπατε στον εαυτό σας ότι χρησιμοποιώντας σχήματα XML! Και θα έχεις απόλυτο δίκιο!
Μπορείτε να μας συγχαρείτε! Το πρώτο μας WSDL γράφτηκε! Και είμαστε ένα βήμα πιο κοντά στην επίτευξη του στόχου μας.
Στη συνέχεια, θα δούμε τι μας παρέχει η PHP για την ανάπτυξη των δικών μας κατανεμημένων εφαρμογών.
5 Ο πρώτος μας διακομιστής SOAP
Νωρίτερα έγραψα ότι για να δημιουργήσουμε έναν διακομιστή SOAP στην PHP θα χρησιμοποιήσουμε την ενσωματωμένη κλάση SoapServer. Προκειμένου για όλα περαιτέρω ενέργειεςσυνέβη με τον ίδιο τρόπο με το δικό μου, θα χρειαστεί να τροποποιήσετε λίγο την PHP σας. Για να είμαστε ακόμη πιο ακριβείς, πρέπει να βεβαιωθείτε ότι έχετε εγκαταστήσει την επέκταση "php-soap". Είναι καλύτερο να διαβάσετε πώς να το εγκαταστήσετε στον διακομιστή ιστού σας στον επίσημο ιστότοπο της PHP (δείτε τη λίστα αναφορών).Αφού εγκατασταθούν και ρυθμιστούν τα πάντα, θα χρειαστεί να δημιουργήσουμε ένα αρχείο στον ριζικό φάκελο της φιλοξενίας σας " smsservice.php» με το ακόλουθο περιεχόμενο:
setClass("SoapSmsGateWay"); //Εκκίνηση του διακομιστή $server->handle();
Ελπίζω να μην χρειάζεται να εξηγήσω τι βρίσκεται πάνω από τη γραμμή με τη συνάρτηση "ini_set". Επειδή εκεί καθορίζεται ποιες κεφαλίδες HTTP θα στείλουμε από τον διακομιστή στον πελάτη και διαμορφώνεται το περιβάλλον. Στη γραμμή με το "ini_set" απενεργοποιούμε την προσωρινή αποθήκευση του αρχείου WSDL έτσι ώστε οι αλλαγές μας σε αυτό να ισχύουν αμέσως στον πελάτη.
Τώρα ερχόμαστε στον διακομιστή! Όπως μπορείτε να δείτε, ολόκληρος ο διακομιστής SOAP παίρνει μόνο τρεις γραμμές! Στην πρώτη γραμμή, δημιουργούμε ένα νέο στιγμιότυπο του αντικειμένου SoapServer και μεταβιβάζουμε τη διεύθυνση της περιγραφής WSDL της υπηρεσίας web στον κατασκευαστή του. Τώρα ξέρουμε ότι θα βρίσκεται στη ρίζα της φιλοξενίας σε ένα αρχείο με το αυτονόητο όνομα " smsservice.wsdl.php" Στη δεύτερη γραμμή, λέμε στον διακομιστή SOAP ποια κλάση πρέπει να τραβήξει για να επεξεργαστεί το φάκελο που ελήφθη από τον πελάτη και να επιστρέψει τον φάκελο με την απόκριση. Όπως ίσως μαντέψατε, σε αυτήν την τάξη θα περιγραφεί η μόνη μας μέθοδος αποστολή SMS. Στην τρίτη γραμμή ξεκινάμε τον διακομιστή! Αυτό είναι όλο, ο διακομιστής μας είναι έτοιμος! Με το οποίο μας συγχαίρω όλους!
Τώρα πρέπει να δημιουργήσουμε το αρχείο WSDL. Για να το κάνετε αυτό, μπορείτε είτε απλώς να αντιγράψετε το περιεχόμενό του από την προηγούμενη ενότητα, είτε να αφεθείτε ελεύθεροι και να το κάνετε "πρότυπο" λίγο:
";
?>
Σε αυτό το στάδιο, θα πρέπει να είμαστε απόλυτα ικανοποιημένοι με τον διακομιστή που προκύπτει, γιατί Μπορούμε να καταγράψουμε τους φακέλους που έρχονται σε αυτό και στη συνέχεια να αναλύσουμε ήρεμα τα εισερχόμενα δεδομένα. Για να λάβουμε οτιδήποτε στον διακομιστή, χρειαζόμαστε έναν πελάτη. Πάμε λοιπόν σε αυτό!
6 πελάτης SOAP καθ' οδόν
Πρώτα από όλα, πρέπει να δημιουργήσουμε ένα αρχείο στο οποίο θα γράψουμε τον πελάτη. Ως συνήθως, θα το δημιουργήσουμε στη ρίζα του κεντρικού υπολογιστή και θα το ονομάσουμε " client.php", και μέσα θα γράψουμε τα εξής: messageList = new MessageList(); $req->messageList->message = new Message(); $req->messageList->message->phone = "79871234567"; $req->messageList->message->text = "Δοκιμαστικό μήνυμα 1"; $req->messageList->message->date = "2013-07-21T15:00:00.26"; $req->messageList->message->type = 15; $client = new SoapClient("http://($_SERVER["HTTP_HOST"])/smsservice.wsdl.php", array("soap_version" => SOAP_1_2)); var_dump($client->sendSms($req));
Ας περιγράψουμε τα αντικείμενά μας. Όταν γράψαμε το WSDL, περιέγραφε τρεις οντότητες για τον φάκελο που εισερχόταν στον διακομιστή: Αίτηση, MessageListΚαι Μήνυμα. Ανάλογα τάξεις Αίτηση, MessageListΚαι Μήνυμαείναι αντανακλάσεις αυτών των οντοτήτων στο σενάριο PHP μας.
Αφού ορίσουμε τα αντικείμενα, πρέπει να δημιουργήσουμε ένα αντικείμενο ( $req), το οποίο θα στείλουμε στον διακομιστή. Μετά από αυτό έρχονται οι δύο πιο αγαπημένες γραμμές για εμάς! Ο πελάτης μας SOAP! Είτε το πιστεύετε είτε όχι, αυτό είναι αρκετό για να αρχίσει ο διακομιστής μας να λαμβάνει μηνύματα από τον πελάτη, καθώς και για να τα λαμβάνει και να τα επεξεργάζεται με επιτυχία ο διακομιστής μας! Στην πρώτη από αυτές, δημιουργούμε μια παρουσία της κλάσης SoapClient και περνάμε τη διεύθυνση της θέσης του αρχείου WSDL στον κατασκευαστή του και στις παραμέτρους υποδεικνύουμε ρητά ότι θα εργαστούμε χρησιμοποιώντας το πρωτόκολλο SOAP έκδοση 1.2. Στην επόμενη γραμμή καλούμε τη μέθοδο αποστολή SMSαντικείμενο $clientκαι εμφανίστε αμέσως το αποτέλεσμα στο πρόγραμμα περιήγησης.
Ας το τρέξουμε και ας δούμε τι πήραμε τελικά!
Το ακόλουθο αντικείμενο επιστράφηκε σε μένα από τον διακομιστή:
Object(stdClass) public "status" => boolean true
Και αυτό είναι υπέροχο, γιατί... Τώρα γνωρίζουμε με βεβαιότητα ότι ο διακομιστής μας λειτουργεί και όχι μόνο λειτουργεί, αλλά μπορεί επίσης να επιστρέψει ορισμένες τιμές στον πελάτη!
Τώρα ας δούμε το αρχείο καταγραφής που κρατάμε με σύνεση από την πλευρά του διακομιστή! Στο πρώτο του μέρος βλέπουμε τα ανεπεξέργαστα δεδομένα που έφτασαν στον διακομιστή:
Αυτός είναι ο φάκελος. Τώρα ξέρετε πώς μοιάζει! Αλλά είναι απίθανο να ενδιαφερόμαστε να το κοιτάμε συνεχώς, οπότε ας απαριθμήσουμε το αντικείμενο από το αρχείο καταγραφής και να δούμε αν όλα είναι καλά:
Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 1 " (μήκος=37) δημόσια "ημερομηνία" => συμβολοσειρά "2013-07-21T15:00:00.26" (μήκος=22) δημόσιο "τύπος" => συμβολοσειρά "15" (μήκος=2)
Όπως μπορείτε να δείτε, το αντικείμενο αποσειρώθηκε σωστά, για το οποίο θέλω να μας συγχαρώ όλους! Κάτι πιο ενδιαφέρον μας περιμένει στη συνέχεια! Δηλαδή, θα στείλουμε τον πελάτη στον διακομιστή όχι μόνο ένα μήνυμα SMS, αλλά ένα ολόκληρο πακέτο (για την ακρίβεια, τρία)!
7 Αποστολή σύνθετων αντικειμένων
Ας σκεφτούμε πώς μπορούμε να μεταφέρουμε μια ολόκληρη δέσμη μηνυμάτων στον διακομιστή σε ένα πακέτο; Μάλλον το περισσότερο με απλό τρόποθα υπάρχει μια οργάνωση πίνακα μέσα στο στοιχείο messageList! Ας το κάνουμε:// δημιουργήστε ένα αντικείμενο για αποστολή στον διακομιστή $req = new Request(); $req->messageList = new MessageList(); $msg1 = new Message(); $msg1->phone = "79871234567"; $msg1->text = "Δοκιμαστικό μήνυμα 1"; $msg1->date = "21-07-2013T15:00:00.26"; $msg1->type = 15; $msg2 = new Message(); $msg2->phone = "79871234567"; $msg2->text = "Δοκιμαστικό μήνυμα 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->type = 16; $msg3 = new Message(); $msg3->phone = "79871234567"; $msg3->text = "Δοκιμαστικό μήνυμα 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->type = 17; $req->messageList->message = $msg1; $req->messageList->message = $msg2; $req->messageList->message = $msg3;
Τα αρχεία καταγραφής μας δείχνουν ότι το ακόλουθο πακέτο ελήφθη από τον πελάτη:
Τι ανοησίες λέτε; Και θα έχεις δίκιο από μια άποψη, γιατί... Μόλις μάθαμε ότι ένα αντικείμενο έφυγε από τον πελάτη, ήρθε στον διακομιστή μας με την ίδια ακριβώς μορφή με τη μορφή φακέλου. Είναι αλήθεια ότι τα μηνύματα SMS δεν ήταν σειριακά σε XML με τον τρόπο που χρειαζόμασταν - έπρεπε να είναι τυλιγμένα σε στοιχεία μήνυμα, όχι μέσα Struct. Τώρα ας δούμε σε ποια μορφή ένα τέτοιο αντικείμενο έρχεται στη μέθοδο αποστολή SMS:
Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "Struct" => array (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public " type" => string "15" (length=2) 1 => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 2" (length= 37) public "date" => string "2014-08-22T16:01:10" (length=19) public "type" => string "16" (length=2) 2 => object(stdClass) public "phone " => string "79871234567" (length=11) public "text" => string "Test message 3" (length=37) public "date" => string "2014-08-22T16:01:10" (length= 19) δημόσιο "type" => συμβολοσειρά "17" (μήκος=2)
Τι μας δίνει αυτή η γνώση; Μόνο που η διαδρομή που επιλέξαμε δεν είναι σωστή και δεν έχουμε λάβει απάντηση στην ερώτηση - «Πώς μπορούμε να μπούμε στον διακομιστή σωστή δομήδεδομένα? Αλλά προτείνω να μην απελπιζόμαστε και να προσπαθήσουμε να μετατρέψουμε τον πίνακα μας στον τύπο ένα αντικείμενο:
$req->messageList->message = (αντικείμενο)$req->messageList->message;
Σε αυτήν την περίπτωση, θα λάβουμε έναν άλλο φάκελο:
Μπήκε στη μέθοδο αποστολή SMSτο αντικείμενο έχει την ακόλουθη δομή:
Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "BOGUS" => array (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public " type" => string "15" (length=2) 1 => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 2" (length= 37) public "date" => string "2014-08-22T16:01:10" (length=19) public "type" => string "16" (length=2) 2 => object(stdClass) public "phone " => string "79871234567" (length=11) public "text" => string "Test message 3" (length=37) public "date" => string "2014-08-22T16:01:10" (length= 19) δημόσιο "type" => συμβολοσειρά "17" (μήκος=2)
Όσο για μένα, «το άθροισμα δεν αλλάζει από την αλλαγή των θέσεων των όρων» (γ). Τι ΨΕΥΔΗΣ, Τι Struct– δεν έχουμε πετύχει ακόμα τον στόχο μας! Και για να το πετύχουμε, πρέπει να βεβαιωθούμε ότι αντί για αυτά τα ακατανόητα ονόματα εμφανίζεται το μητρικό μας μήνυμα. Αλλά ο συγγραφέας δεν ξέρει ακόμα πώς να το πετύχει αυτό. Επομένως, το μόνο που μπορούμε να κάνουμε είναι να απαλλαγούμε από το επιπλέον δοχείο. Με άλλα λόγια, θα φροντίσουμε τώρα ότι αντί για μήνυμαέγινε ΨΕΥΔΗΣ! Για να το κάνετε αυτό, αλλάξτε το αντικείμενο ως εξής:
// δημιουργήστε ένα αντικείμενο για αποστολή στον διακομιστή $req = new Request(); $msg1 = new Message(); $msg1->phone = "79871234567"; $msg1->text = "Δοκιμαστικό μήνυμα 1"; $msg1->date = "21-07-2013T15:00:00.26"; $msg1->type = 15; $msg2 = new Message(); $msg2->phone = "79871234567"; $msg2->text = "Δοκιμαστικό μήνυμα 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->type = 16; $msg3 = new Message(); $msg3->phone = "79871234567"; $msg3->text = "Δοκιμαστικό μήνυμα 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->type = 17; $req->messageList = $msg1; $req->messageList = $msg2; $req->messageList = $msg3; $req->messageList = (αντικείμενο)$req->messageList;
Τι γίνεται αν σταθούμε τυχεροί και βγει το σωστό όνομα από το διάγραμμα; Για να το κάνουμε αυτό, ας δούμε τον φάκελο που έφτασε:
Ναι, δεν έγινε θαύμα! ΨΕΥΔΗΣ- Δεν θα κερδίσουμε! Ήρθε να αποστολή SMSτο αντικείμενο σε αυτή την περίπτωση θα μοιάζει με αυτό:
Object(stdClass) public "messageList" => object(stdClass) public "BOGUS" => array (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (length=11) public " text" => string "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public "type" => string "15" (length =2) 1 => αντικείμενο(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 2" (length=37) public "date" => string " 2014-08-22T16:01:10" (μήκος=19) δημόσιος "τύπος" => συμβολοσειρά "16" (μήκος=2) 2 => αντικείμενο(stdClass) δημόσιο "τηλέφωνο" => συμβολοσειρά "79871234567" (μήκος= 11) public "text" => string "Test message 3" (length=37) public "date" => string "2014-08-22T16:01:10" (length=19) public "type" => string " 17" (μήκος = 2)
Όπως λένε – «Σχεδόν»! Σε αυτό το (ελαφρώς λυπηρό) σημείωμα, προτείνω να ολοκληρώσουμε σιγά σιγά τα πράγματα και να βγάλουμε κάποια συμπεράσματα για τον εαυτό μας.
8 Συμπέρασμα
Επιτέλους φτάσαμε εδώ! Ας καταλάβουμε τι μπορείτε να κάνετε τώρα:- Μπορείτε να γράψετε το αρχείο WSDL που είναι απαραίτητο για την υπηρεσία web σας.
- Μπορείτε εύκολα να γράψετε τον δικό σας πελάτη που μπορεί να επικοινωνεί με τον διακομιστή μέσω SOAP.
- μπορείς να γράψεις το δικό σου δικός διακομιστήςεπικοινωνία με τον έξω κόσμο μέσω SOAP·
- μπορείτε να στείλετε πίνακες του ίδιου τύπου αντικειμένων στον διακομιστή από τον πελάτη σας (με ορισμένους περιορισμούς).
- η εγγενής κλάση SoapClient δεν σειριοποιεί σωστά τις δομές δεδομένων του ίδιου τύπου σε XML.
- κατά τη σειριοποίηση ενός πίνακα σε XML δημιουργεί ένα επιπλέον στοιχείο που ονομάζεται Struct;
- κατά τη σειριοποίηση ενός αντικειμένου σε XML, δημιουργείται ένα επιπλέον στοιχείο που ονομάζεται ΨΕΥΔΗΣ;
- ΨΕΥΔΗΣ μικρότερο κακόπως Structλόγω του γεγονότος ότι ο φάκελος είναι πιο συμπαγής (δεν προστίθενται επιπλέον χώροι ονομάτων στην κεφαλίδα XML του φακέλου).
- Δυστυχώς, η κλάση SoapServer δεν επικυρώνει αυτόματα τα δεδομένα φακέλου με το σχήμα XML μας (ίσως και άλλοι διακομιστές να μην το κάνουν αυτό).
Γενικά, σήμερα υπάρχουν τυπικά πρωτόκολλα ανταλλαγής δεδομένων XML:
- XML-RPC– μεταβιβάζετε το πακέτο και υποδεικνύετε ποια μέθοδο στον διακομιστή θέλετε να καλέσετε.
- ΥΠΟΛΟΙΠΟ- υπάρχουν κάποια αντικείμενα στον διακομιστή. Κάθε αντικείμενο χαρακτηρίζεται από κάποιο είδος αναγνωριστικού. Κάθε στοιχείο έχει τη δική του διεύθυνση url. Μπορείτε να κάνετε τα εξής με οποιοδήποτε στοιχείο: εισαγωγή, διαγραφή, ενημέρωση, επιλογή. Απλώς στέλνετε το επιθυμητό αίτημα στον διακομιστή (για παράδειγμα, εισάγετε ένα τέτοιο στοιχείο). Η ανταλλαγή πελάτη-διακομιστή βασίζεται είτε σε JSON είτε σε XML.
Το SOAP (αρχιτεκτονική προσανατολισμένη στις υπηρεσίες, ένα σύνολο χαλαρά συζευγμένων υπηρεσιών που αλληλεπιδρούν μεταξύ τους) βασίζεται στο RPC. Το κύριο πλεονέκτημα του RPC είναι ο μικρός αριθμός πόρων δικτύου (σημεία εισόδου) και οι πολλές μέθοδοι που εμπλέκονται. Παρά αυτό το πλεονέκτημα, το RPC είναι ένα ξεπερασμένο πρωτόκολλο που έχει μια σειρά από μειονεκτήματα:
- Δεν είναι δυνατή η επαλήθευση της εγκυρότητας ενός μηνύματος XML-RPC. Το παλιό πρωτόκολλο δημιουργήθηκε πριν από την τυποποίηση των σχημάτων (μέθοδοι επικύρωσης δεδομένων) σε XML. Εκείνοι. Ο διακομιστής δέχεται αιτήματα, πρέπει να διασφαλίσει ότι τα αιτήματα είναι για αυτόν και ότι τα δεδομένα είναι συνεπή. Στο XML-RPC, οι τύποι δεδομένων δηλώνονται για αυτό, αλλά πρόκειται για έλεγχο τύπου δεδομένων και δεν ελέγχεται η συνέπεια δεδομένων (ότι λάβατε μια δομή με όλες τις απαραίτητες παραμέτρους).
- Δεν μπορείτε να δημιουργήσετε συνδυασμένα μηνύματα.
- Δεν μπορείτε να χρησιμοποιήσετε χώρο και χρόνο (εμφανίστηκε μετά τη δημιουργία του RPC).
- Δεν μπορείτε να επεκτείνετε το μήνυμα, π.χ. προσθέστε επιπλέον πληροφορίες.
Όλες αυτές οι ελλείψεις επιλύθηκαν στο XML Schema. Αυτό είναι ένα βιομηχανικό πρότυπο Περιγραφές XMLέγγραφο. Εκείνοι. είναι ένας τρόπος μοντελοποίησης αυθαίρετων δεδομένων. Ένα σχήμα XML μπορεί να περιγράψει ένα μοντέλο (σχέσεις μεταξύ στοιχείων και χαρακτηριστικών και τη δομή τους), τύπους δεδομένων (χαρακτηρίζει τύπους δεδομένων) και ένα λεξικό (ονόματα στοιχείων και χαρακτηριστικών).
Με βάση όλες τις ελλείψεις του XML-RPC, δημιουργήθηκε το πρωτόκολλο SOAP.
ΣΑΠΟΥΝΙ(Πρωτόκολλο πρόσβασης απλού αντικειμένου) - πρωτόκολλο πρόσβασης σε ένα αντικείμενο (στο σημείο εισόδου). Σήμερα είναι το κύριο βιομηχανικό πρότυπο για την κατασκευή κατανεμημένων εφαρμογών.
Αντιπροσωπεύει επεκτάσεις στη γλώσσα XML-RPC. Εκείνοι. βασίζεται στην αρχή: 1 σημείο εισόδου και οποιεσδήποτε μέθοδοι. Το ίδιο το πρωτόκολλο όσον αφορά τη μεταφορά (πώς να μεταφέρω δεδομένα) δίνει ευρεία επιλογή: SMTP, FTP, HTTP, MSMQ.
Το SOAP αποτελεί τη βάση της υλοποίησης των υπηρεσιών web XML (XML web services). Το μειονέκτημα του SOAP είναι ότι είναι δύσκολο να το μάθεις.
Το SOAP βασίζεται στην ανταλλαγή μηνυμάτων μεταξύ ενός πελάτη και ενός διακομιστή (σύγχρονα και ασύγχρονα). Κάθε μήνυμα μεταφέρει πληροφορίες σχετικά με τα δεδομένα (τι δεδομένα μεταδίδονται και λαμβάνονται). Το SOAP περιγράφει εκ των προτέρων ολόκληρη τη δομή ενός μηνύματος χρησιμοποιώντας σχήματα XML: τι πρέπει να υπάρχει στο μήνυμα, πώς θα μεταδοθεί. Αυτό καθιστά δυνατό, χωρίς να γνωρίζει ο διακομιστής, να κατανοήσει τι συμβαίνει εκεί και επιτρέπει στον διακομιστή να ελέγξει εάν αυτό το μήνυμα είναι για αυτόν.
Σχήμα XML
Ο σκοπός ενός σχήματος είναι να περιγράψει τη δομή των δεδομένων, δηλ. τι έχουμε. Όλα τα δεδομένα χωρίζονται σε απλούς και σύνθετους τύπους (βαθμωτές και δομές). Ένας απλός τύπος (συμβολοσειρά, αριθμός, boolean, ημερομηνία) δεν θα περιέχει ποτέ τίποτα μέσα. Και μια δομή (αντικείμενο) μπορεί να περιέχει ιδιότητες.
Βασικές λειτουργίες SOAP
- Όχι μόνο απλή ανταλλαγή πληροφοριών πελάτη-διακομιστή. Αλλά επίσης αυτόματη αναγνώρισηδιακομιστή και αναζητήστε αυτόν τον διακομιστή, π.χ. ο πελάτης μπορεί να μην ξέρει τίποτα για τον διακομιστή. Εκείνοι. ο πελάτης αναζητά πρώτα τον διακομιστή, βρίσκει τις κατάλληλες υπηρεσίες, κατανοεί ποιες μέθοδοι υπάρχουν, τι διαθέτει ο διακομιστής και τον καλεί.
- Ο διακομιστής δημοσιεύει τις πληροφορίες του (τοποθεσία, ποιες μεθόδους υποστηρίζει) έτσι ώστε ο πελάτης να βρει αυτόν τον διακομιστή. Η δημοσίευση πραγματοποιείται στον κατάλογο UDDI.
Δομή μηνύματος SOAP:
- Φάκελος SOAP - περιλαμβάνει ολόκληρο το μήνυμα. Αποτελείται από μια κεφαλίδα και ένα σώμα.
- SOAP Header (κεφαλίδα) - πρόσθετες πληροφορίες (εξουσιοδότηση, για παράδειγμα).
- SOAP Body (σώμα) - το ίδιο το μήνυμα.
- Το SOAP Fault (σφάλμα) είναι μια μέθοδος μετάδοσης ενός σφάλματος από τον διακομιστή στον πελάτη.
WSDL
WSDL(Web Services Description Language) - γλώσσα για την περιγραφή των υπηρεσιών web. Χρησιμοποιείται στο SOAP. Αυτό είναι ένα είδος εγγράφου που περιγράφει τα πάντα: ποιοι χώροι ονομάτων χρησιμοποιήθηκαν, ποια σχήματα δεδομένων χρησιμοποιήθηκαν, ποιοι τύποι μηνυμάτων αναμένει ο διακομιστής από τον πελάτη, ποιοι φάκελοι ανήκουν σε ποια μέθοδο, ποιες μέθοδοι υπάρχουν, σε ποια διεύθυνση να σταλεί κ.λπ. . Στην πραγματικότητα, το WSDL είναι μια υπηρεσία web. Αρκεί ο πελάτης να μελετήσει το περιεχόμενο αυτού του εγγράφου, γνωρίζει ήδη τα πάντα για τον διακομιστή.
Οποιοσδήποτε διακομιστής πρέπει να δημοσιεύει το WSDL.
Το WSDL αποτελείται από μπλοκ:
- Ορισμός της ίδιας της υπηρεσίας, δηλ. σημείο εισόδου, υποδεικνύεται η θύρα.
- Μορφή μεθόδων. Το σημείο εισόδου συνδέεται με λειτουργίες, π.χ. ποιες μεθόδους υποστηρίζει; Υποδεικνύεται ο τύπος κλήσης και η μέθοδος μετάδοσης. Μέσα σε κάθε μέθοδο υπάρχει μια εξήγηση για τη μορφή με την οποία μεταδίδονται τα δεδομένα - με τη μορφή SOAP.
- Μέθοδοι δέσμευσης σε ένα μήνυμα.
- Περιγραφή των ίδιων των μηνυμάτων.
Όπως αναφέρθηκε στο προηγούμενο κεφάλαιο, οι υπηρεσίες Ιστού επικοινωνούν με τους πελάτες και μεταξύ τους στέλνοντας μηνύματα σε XML. Οι ετικέτες αυτής της υλοποίησης XML, οι κανόνες για τη μορφοποίηση του εγγράφου XML και η σειρά με την οποία ανταλλάσσονται τα έγγραφα ορίζονται από το πρωτόκολλο SOAP. Το πρωτόκολλο SOAP δημιουργήθηκε το 1998 από μια ομάδα προγραμματιστών με επικεφαλής τον Dave Winer, ο οποίος εργαζόταν στη Microsoft Corporation και στο Userland. Το όνομα του πρωτοκόλλου - "Simple Object Access Protocol" - αντικατοπτρίζει τον αρχικό του σκοπό - την πρόσβαση στις μεθόδους απομακρυσμένων αντικειμένων. Ο σκοπός του πρωτοκόλλου έχει αλλάξει, είναι πλέον ένα πρωτόκολλο για οποιαδήποτε αλληλεπίδραση μεταξύ των υπηρεσιών Ιστού και των στοιχείων χαλαρά συνδεδεμένων κατανεμημένων εφαρμογών. Δεν είναι πλέον εντελώς απλό και δεν λέει τίποτα για αντικείμενα. Πολλοί προγραμματιστές προτείνουν να το ονομάσουμε "Πρωτόκολλο Αρχιτεκτονικής με προσανατολισμό στην υπηρεσία", αφήνοντας την προηγούμενη συντομογραφία. Για να σταματήσουν αυτές οι προσπάθειες, η προδιαγραφή SOAP 1.2 αναφέρει ότι η λέξη "SOAP" δεν θα γράφεται πλέον με κανέναν τρόπο.
Στα τέλη του 1999, η ανάπτυξη του πρωτοκόλλου μεταφέρθηκε στην κοινοπραξία W3C (http:// www.w3.org/).
Τον Μάιο του 2000, η κοινοπραξία κυκλοφόρησε την έκδοση του SOAP 1.1. Ένα μήνυμα γραμμένο χρησιμοποιώντας το πρωτόκολλο SOAP μορφοποιείται ως έγγραφο XML που χρησιμοποιεί ενεργά χώρους ονομάτων. Τα ονόματα στοιχείων SOAP 1.1 XML αναφέρονται στο αναγνωριστικό χώρου ονομάτων http://schemas.xmlsoap.org/soap/envelope/.
Το δεύτερο προσχέδιο του SOAP 1.2 κυκλοφόρησε το 2001, ο χώρος ονομάτων του εκείνη την εποχή ονομαζόταν http://www.w3.org/2001/06/soap-envelope.
Σημειώστε ότι είναι το αναγνωριστικό χώρου ονομάτων και όχι ο αριθμός 1.1 ή 1.2 που καθορίζει την έκδοση SOAP. Ο διακομιστής δεν θα εξετάσει το μήνυμα SOAP και θα επιστρέψει ένα μήνυμα σφάλματος εάν το παρατηρήσει
αναντιστοιχία χώρου ονομάτων.
Καθώς το γράφω αυτό, το SOAP 1.1 εξακολουθεί να λειτουργεί. Η έκδοση 1.2 δεν μπορεί να εγκαταλείψει το προπαρασκευαστικό στάδιο, αλλά χρησιμοποιείται ήδη, για παράδειγμα, στο SOAP::Lite, Apache SOAP 2.3, Apache Axis. Επομένως, σε αυτό το κεφάλαιο θα περιγράψω την έκδοση 1.2, σημειώνοντας τις διαφορές της από την έκδοση 1.1.
Η προδιαγραφή λειτουργικού SOAP αποθηκεύεται πάντα στη διεύθυνση http://www.w3.org/TR/SOAP/. Τα έγγραφα που βρίσκονται σε αυτήν τη διεύθυνση αντικαθίστανται με νέα κατά την αντικατάσταση της λειτουργικής έκδοσης.
Το πρόχειρο SOAP ενημερώνεται συνεχώς και το αναγνωριστικό χώρου ονομάτων αλλάζει. Νεότερη επιλογήΗ πρόχειρη έκδοση τη στιγμή της σύνταξης βρισκόταν στη διεύθυνση http://www.w3.org/TR/soapl2-partl/ και ο χώρος ονομάτων που χρησιμοποιούσε ονομαζόταν http://www.w3.org/2002/06/soap -φάκελος. Σημειώστε ότι η προδιαγραφή SOAP 12 αποτελείται από δύο μέρη: μέρος 1 και μέρος 2. Το δεύτερο μέρος της προδιαγραφής - η εφαρμογή - περιέχει κανόνες για την καταγραφή πολύπλοκων τύπων δεδομένων. Η προδιαγραφή έχει ένα άλλο μέρος του partO - παραδείγματα μηνυμάτων που έχουν συνταχθεί σύμφωνα με τους κανόνες του SOAP 1.2.
Δομή μηνυμάτων SOAP
Η προδιαγραφή ορίζει ένα μήνυμα SOAP ως ένα έγγραφο XML που δεν περιέχει δήλωση τύπου εγγράφου ή οδηγίες επεξεργασίας. Το ριζικό στοιχείο αυτού του εγγράφου XML ονομάζεται
και άλλα χαρακτηριστικά που παρέχονται με προθέματα. Το ριζικό στοιχείο περιέχει ένα προαιρετικό στοιχείο που περιέχει την κεφαλίδα του μηνύματος και ένα απαραίτητο στοιχείο
, στο οποίο καταγράφονται τα περιεχόμενα του μηνύματος. Η έκδοση 1.1 επιτρέπεται μετά το σώμα για να γράψετε αυθαίρετα στοιχεία, έπρεπε να μπουν πρόθεμα τα ονόματά τους. Η έκδοση 1.2 απαγορεύει την εγγραφή οτιδήποτε μετά το στοιχείο . Εν ολίγοις, η γενική δομή ενός μηνύματος SOAP είναι: xmlns:env="http://www.w3.org/2002/06/soap-envelope"> < ! - Блоки заголовка ->
Στοιχείο
Το γεγονός είναι ότι ένα μήνυμα SOAP μπορεί να περάσει από πολλούς διακομιστές SOAP ή από πολλές εφαρμογές στον ίδιο διακομιστή. Αυτές οι εφαρμογές επεξεργάζονται εκ των προτέρων τα μπλοκ κεφαλίδας μηνυμάτων και τα μεταδίδουν μεταξύ τους. Όλοι αυτοί οι διακομιστές και/ή οι εφαρμογές ονομάζονται κόμβοι SOAP. Η προδιαγραφή SOAP δεν ορίζει κανόνες για τη μετάδοση ενός μηνύματος μέσω μιας αλυσίδας διακομιστών. Για το σκοπό αυτό, αναπτύσσονται άλλα πρωτόκολλα, για παράδειγμα, το Microsoft WS-Routing.
Το χαρακτηριστικό actor καθορίζει τον κόμβο στόχο SOAP - αυτόν που βρίσκεται στο τέλος της αλυσίδας και θα επεξεργαστεί ολόκληρη την κεφαλίδα. Εννοια
Το χαρακτηριστικό actor υποδεικνύει ότι η κεφαλίδα θα υποβληθεί σε επεξεργασία από τον πρώτο διακομιστή που τη λαμβάνει. Μετά την επεξεργασία, το μπλοκ αφαιρείται από το μήνυμα SOAP.
Στην έκδοση 1.2, το χαρακτηριστικό actor αντικαθίσταται από το χαρακτηριστικό ρόλος επειδή σε αυτήν την έκδοση του SOAP, κάθε κόμβος παίζει έναν ή περισσότερους ρόλους. Η προδιαγραφή αυτή τη στιγμή ορίζει τρεις ρόλους κόμβου SOAP.
Ο ρόλος του http://^^.w3.org/2002/06/soap-envelope/role/ultimateReceiver διαδραματίζεται από τον τελικό κόμβο στόχο που θα επεξεργαστεί την κεφαλίδα.
Ο ρόλος http://www.w3.org/2002/06/soap-envelope/role/next παίζεται από τον ενδιάμεσο ή τον κόμβο στόχο. Ένας τέτοιος κόμβος μπορεί να παίξει άλλους, πρόσθετους ρόλους.
Ο ρόλος http://www.w3.org/2002/06/soap-envelope/role/none δεν πρέπει να παίζεται από κανέναν κόμβο SOAP.
Οι κατανεμημένες εφαρμογές, με βάση τις ανάγκες τους, μπορούν να προσθέσουν άλλους ρόλους σε αυτούς τους ρόλους, για παράδειγμα, να εισάγουν έναν ενδιάμεσο διακομιστή που ελέγχει ψηφιακή υπογραφήκαι ορίστε αυτόν τον ρόλο για αυτό με κάποια συμβολοσειρά URI.
Η τιμή του χαρακτηριστικού ρόλου μπορεί να είναι οποιαδήποτε συμβολοσειρά URI που υποδεικνύει το ρόλο του κόμβου στον οποίο προορίζεται αυτό το μπλοκ κεφαλίδας. Η προεπιλεγμένη τιμή για αυτό το χαρακτηριστικό είναι η κενή τιμή, δηλαδή μόνο ένα ζεύγος εισαγωγικών ή η συμβολοσειρά URI http://\vw\v.w3.org/2002/06/soap-envelope/rale/ultimateReceiver.
Η τιμή του χαρακτηριστικού ρόλου υποδεικνύει ότι το μπλοκ πρέπει να υποβληθεί σε επεξεργασία από έναν κόμβο που παίζει τον ρόλο που καθορίζεται από την ίδια συμβολοσειρά.
Ένα άλλο χαρακτηριστικό στοιχείου
Στην έκδοση 1.2 SOAP, αντί για τον αριθμό o, πρέπει να γράψετε τη λέξη false και αντί για τον αριθμό 1, να γράψετε τη λέξη true.
Στο σώμα της κεφαλίδας
Λίστα 3.1. Κεφαλίδα με ένα μπλοκ
xmlns:t="http://some.com/transaction" env:role= "http://www.w3.org/2002/06/soap-envelope/role/ultimateReceiver" env:mustUnderstand="1">
Τα στοιχεία που είναι ένθετα μέσα σε μπλοκ κεφαλίδας δεν ονομάζονται πλέον μπλοκ. Δεν μπορούν να περιέχουν τα χαρακτηριστικά του ρόλου, του ηθοποιού και πρέπει να κατανοήσουν.
Στοιχείο
πρέπει να γράφεται αμέσως μετά το στοιχείοΜήνυμα λάθους
Εάν ένας διακομιστής SOAP, κατά την επεξεργασία ενός μηνύματος SOAP που έλαβε, παρατηρήσει ένα σφάλμα, θα σταματήσει την επεξεργασία και θα στείλει ένα μήνυμα SOAP στον πελάτη, στο σώμα του οποίου θα γράψει ένα στοιχείο
Στο μήνυμα που γράφτηκε στο σώμα ενός στοιχείου SOAP 1.1,
Υπάρχουν τέσσερα μέρη που περιγράφονται από τα ακόλουθα υποστοιχεία.
Κωδικός λάθους
Περιγραφή του σφάλματος
Θέση του σφάλματος
Λεπτομέρειες σφάλματος
Για παράδειγμα: xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
Το SOAP έκδοση 1.2 άλλαξε το περιεχόμενο του στοιχείου Όπως περιγράφεται στο
namespace http://www.w3.org/2002/06/soap-envelope, περιλαμβάνει δύο απαιτούμενα στοιχεία και τρία προαιρετικά στοιχεία.
Απαιτούμενα στοιχεία.
Κωδικός λάθους . Περιέχει ένα απαιτούμενο υποστοιχείο<:value>με κωδικό σφάλματος και προαιρετικό υποστοιχείο
Λόγος λάθους
Προαιρετικά στοιχεία.
?
?
?
Η λίστα 3.2 εμφανίζει ένα μήνυμα σφάλματος που παρουσιάστηκε κατά την προσπάθεια εκτέλεσης μιας διαδικασίας. Το σφάλμα είναι ότι τα ονόματα των ορισμάτων της διαδικασίας είναι γραμμένα λανθασμένα στο μήνυμα SOAP και η διαδικασία δεν μπορεί να τα κατανοήσει.
Λίστα 3.2. Μήνυμα λάθους
xmlns:env="http://www.w3.org/2002/06/soap-envelope" xmlns:rpc=’http://www.w3.org/2002/06/soap-rpc’> xmlns:e="http://www.example.org/faults"> Τύποι σφαλμάτων Η λίστα των κωδικών σφαλμάτων αλλάζει και διευρύνεται συνεχώς. Η έκδοση 1.1 ορίζει τέσσερις τύπους σφαλμάτων. VersionMismatch - ο χώρος ονομάτων δεν αναγνωρίζεται. Μπορεί να είναι ξεπερασμένο ή το όνομά του μπορεί να είναι ανορθόγραφο. MustUnderstand - Ένα μπλοκ κεφαλίδας που επισημαίνεται με ένα χαρακτηριστικό mustUnderstand με τιμή 1 δεν συμμορφώνεται με τη σύνταξή του όπως ορίζεται στο σχήμα του εγγράφου. Πελάτης - το έγγραφο XML που περιέχει το μήνυμα έχει λανθασμένη μορφή και για αυτόν τον λόγο ο διακομιστής δεν μπορεί να το επεξεργαστεί. Ο πελάτης πρέπει να αλλάξει το μήνυμα. Διακομιστής - ο διακομιστής δεν μπορεί να επεξεργαστεί το σωστά ηχογραφημένο μήνυμα για εσωτερικούς λόγους. Η έκδοση 1.2 ορίζει πέντε τύπους σφαλμάτων. VersionMismatch - ο χώρος ονομάτων δεν αναγνωρίζεται. Μπορεί να είναι ξεπερασμένο ή το όνομά του να είναι γραμμένο σωστά ή να υπάρχει ένα όνομα στοιχείου XML στο μήνυμα που δεν έχει οριστεί σε αυτόν τον χώρο ονομάτων. Ο διακομιστής γράφει το στοιχείο στην κεφαλίδα απόκρισης MustUnderstand - Ένα μπλοκ κεφαλίδας που επισημαίνεται με το χαρακτηριστικό mustunderstand που έχει οριστεί σε true δεν συμμορφώνεται με τη σύνταξή του όπως ορίζεται στο σχήμα του εγγράφου. Ο διακομιστής γράφει τα ακόλουθα στοιχεία στην κεφαλίδα απόκρισης: DataEncodingUnknown - το μήνυμα περιείχε ακατανόητα δεδομένα, ίσως ήταν γραμμένο σε άγνωστη κωδικοποίηση. Αποστολέας - το έγγραφο XML που περιέχει το μήνυμα έχει λανθασμένη μορφή και για το λόγο αυτό ο διακομιστής δεν μπορεί να το επεξεργαστεί. Ο πελάτης πρέπει να αλλάξει το μήνυμα. Δέκτης - ο διακομιστής δεν μπορεί να επεξεργαστεί το σωστά ηχογραφημένο μήνυμα για δικούς του εσωτερικούς λόγους, για παράδειγμα, λείπει ο απαιτούμενος αναλυτής XML. Ο διακομιστής μπορεί να προσθέσει μερικούς από τους δικούς του τύπους σε αυτούς τους τύπους σφαλμάτων. Συνήθως αναλύουν τυπικούς τύπους, και μηνύματα σχετικά με αυτά εμφανίζονται στα στοιχεία ? Λίστα 3.3. Απόκριση διακομιστή με μήνυμα σφάλματος όπως το VersionMismatch xmlns:env="http://www.w3.org/2002/06/soap-envelope"> xmlns:upg="http://www.w3.org/2002/06/soap-upgrade"> xmlns:nsl="http://www.w3.org/2002/06/soap-envelope"/> xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/"/> ListongZ.4. Απόκριση διακομιστή με μήνυμα σφάλματος όπως το MustUnderstand xmlns:t=’http://some.com/transaction’ /> Μία ή περισσότερες υποχρεωτικές κεφαλίδες δεν είναι κατανοητές
Βιβλιογραφία:
Khabibullin I. Sh. Ανάπτυξη υπηρεσιών Ιστού χρησιμοποιώντας Java. - Αγία Πετρούπολη: BHV-Petersburg, 2003. - 400 σελ.: ill.
ΣΑΠΟΥΝΙ- ένα πρωτόκολλο κειμένου που χρησιμοποιεί XML για την ανταλλαγή δομημένων μηνυμάτων σε ένα κατανεμημένο υπολογιστικό περιβάλλον. Το SOAP προοριζόταν αρχικά για την υλοποίηση κλήσεων απομακρυσμένης διαδικασίας (RPC) και το όνομα ήταν ακρωνύμιο: Simple Object Access Protocol. Το πρωτόκολλο χρησιμοποιείται πλέον για την ανταλλαγή αυθαίρετων μηνυμάτων σε μορφή XML και όχι μόνο για την κλήση διαδικασιών. Επίσημες προδιαγραφές τελευταία έκδοσηΤο 1.2 του πρωτοκόλλου δεν αποκρυπτογραφεί με κανέναν τρόπο το όνομα SOAP. Το SOAP είναι μια επέκταση του πρωτοκόλλου XML-RPC. Το SOAP μπορεί να χρησιμοποιηθεί με οποιοδήποτε πρωτόκολλο επιπέδου εφαρμογής: SMTP, FTP, HTTP κ.λπ. Ωστόσο, η αλληλεπίδρασή του με καθένα από αυτά τα πρωτόκολλα έχει τα δικά του χαρακτηριστικά που πρέπει να οριστούν ξεχωριστά. Τις περισσότερες φορές, το SOAP χρησιμοποιείται μέσω HTTP. Το SOAP είναι ένα από τα πρότυπα στα οποία βασίζονται οι τεχνολογίες διαδικτυακών υπηρεσιών. Η επικοινωνία μεταξύ των υπηρεσιών web και των πελατών τους πραγματοποιείται μέσω μηνυμάτων σε μορφή XML. Το SOAP (Simple Object Access Protocol) είναι ένα πρωτόκολλο μηνυμάτων για την επιλογή υπηρεσιών web. Μπορούμε να πούμε ότι η μορφή SOAP είναι ιδανική για την τεχνολογία RPC (Remote Procedure Call), καθώς το μήνυμα SOAP περιέχει παραμέτρους που αποστέλλονται από τον πελάτη ή μια τιμή επιστροφής που αποστέλλεται από την υπηρεσία.
Πλεονεκτήματα χρήσης της μορφής SOAP:
· Πιο ευέλικτοι τύποι δεδομένων.
· Υποστήριξη για κεφαλίδες και επεκτάσεις:
Ελαττώματα:
· Η χρήση SOAP για τη μετάδοση μηνυμάτων αυξάνει τον όγκο τους και μειώνει την ταχύτητα επεξεργασίας. Σε συστήματα όπου η ταχύτητα είναι σημαντική, είναι πιο συνηθισμένο να στέλνονται έγγραφα XML απευθείας μέσω HTTP, όπου οι παράμετροι αιτήματος μεταβιβάζονται ως κανονικές παράμετροι HTTP.
· Αν και το SOAP είναι ένα πρότυπο, διάφορα προγράμματασυχνά δημιουργούν μηνύματα σε ασύμβατη μορφή. Για παράδειγμα, ένα αίτημα που δημιουργείται από έναν πελάτη AXIS δεν θα γίνει κατανοητό από τον διακομιστή WebLogic.
Βασικές έννοιες του πρωτοκόλλου: Το μέρος που στέλνει το μήνυμα SOAP ονομάζεται αποστολέας SOAP και το μέρος που λαμβάνει ονομάζεται δέκτης SOAP. Η διαδρομή που ακολουθεί ένα μήνυμα SOAP από τον αρχικό αποστολέα στον τελικό παραλήπτη ονομάζεται διαδρομή μηνύματος. Η διαδρομή μηνύματος περιέχει τον αρχικό αποστολέα, τον τελικό παραλήπτη και 0 ή περισσότερους μεσάζοντες SOAP. Τα αντικείμενα που επεξεργάζονται μηνύματα σύμφωνα με τους κανόνες συγκεκριμένων πρωτοκόλλων SOAP ονομάζονται κόμβοι SOAP. Η στοιχειώδης μονάδα πληροφοριών που συμμετέχει στην ανταλλαγή μεταξύ των κόμβων SOAP ονομάζεται Μήνυμα SOAPείναι ένα έγγραφο XML με περιτύλιγμα SOAP γύρω από το ριζικό στοιχείο.