Πρωτόκολλο SOAP και Υπηρεσίες Ιστού. XML υπηρεσίες web. Πρωτόκολλο SOAP

Ο τίτλος του θέματος είναι πραγματικά μια ερώτηση, γιατί... Ο ίδιος δεν ξέρω τι είναι και για πρώτη φορά θα προσπαθήσω να το δουλέψω στο πλαίσιο αυτού του άρθρου. Το μόνο πράγμα που μπορώ να εγγυηθώ είναι ότι ο κώδικας που παρουσιάζεται παρακάτω θα λειτουργήσει, αλλά οι φράσεις μου θα είναι μόνο υποθέσεις και εικασίες για το πώς εγώ ο ίδιος καταλαβαίνω όλα αυτά. Λοιπόν πάμε...

Εισαγωγή

Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως RPC (Remote Procedure Calling). Παραδείγματα περιλαμβάνουν τεχνολογίες CORBA και για Java - RMI (Remote Method Invoking). Και όλα δείχνουν να είναι καλά σε αυτούς, ειδικά στην CORBA, γιατί... Μπορείτε να εργαστείτε με αυτό σε οποιαδήποτε γλώσσα προγραμματισμού, αλλά κάτι έλειπε ακόμα. Πιστεύω ότι το μειονέκτημα της CORBA είναι ότι λειτουργεί μέσω κάποιων δικών της πρωτόκολλα δικτύουαντί απλό HTTP, το οποίο θα χωράει σε οποιοδήποτε τείχος προστασίας. Η ιδέα της διαδικτυακής υπηρεσίας ήταν να δημιουργήσει ένα RPC που θα εισαγόταν σε πακέτα HTTP. Έτσι ξεκίνησε η ανάπτυξη του προτύπου. Ποιες είναι οι βασικές έννοιες αυτού του προτύπου:
  1. ΣΑΠΟΥΝΙ. Πριν καλέσετε μια απομακρυσμένη διαδικασία, πρέπει να περιγράψετε αυτήν την κλήση αρχείο XML e Μορφή SOAP. Το SOAP είναι απλώς μια από τις πολλές σημάνσεις XML που χρησιμοποιούνται σε υπηρεσίες web. Όλα όσα θέλουμε να στείλουμε κάπου μέσω HTTP μετατρέπονται πρώτα σε περιγραφή XML SOAP, στη συνέχεια γεμίζονται σε ένα πακέτο HTTP και αποστέλλονται σε άλλον υπολογιστή στο δίκτυο μέσω TCP/IP.
  2. WSDL. Υπάρχει μια διαδικτυακή υπηρεσία, π.χ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία web και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο XML, το οποίο έχει διαφορετική μορφή, δηλαδή το WSDL. Εκείνοι. Το WSDL είναι απλώς ένα αρχείο XML που περιγράφει μια υπηρεσία Ιστού και τίποτα περισσότερο.
Γιατί τόσο συνοπτικά ρωτάς; Δεν μπορείς να γίνεις πιο συγκεκριμένος; Είναι πιθανώς δυνατό, αλλά για να το κάνετε αυτό θα πρέπει να απευθυνθείτε σε βιβλία όπως το T. Mashnin, "Java Web Services". Εκεί, στις πρώτες 200 σελίδες, υπάρχει μια λεπτομερής περιγραφή κάθε ετικέτας των προτύπων SOAP και WSDL. Αξίζει να το κάνετε; Κατά τη γνώμη μου, όχι γιατί... Όλα αυτά δημιουργούνται αυτόματα στην Java και χρειάζεται μόνο να γράψετε τα περιεχόμενα των μεθόδων που υποτίθεται ότι καλούνται εξ αποστάσεως. Έτσι, ένα API όπως το JAX-RPC εμφανίστηκε στην Java. Αν κάποιος δεν ξέρει, όταν λέει ότι η Java έχει ένα τέτοιο API, σημαίνει ότι υπάρχει ένα πακέτο με ένα σύνολο κλάσεων που ενσωματώνουν την εν λόγω τεχνολογία. Το JAX-RPC εξελίχθηκε με την πάροδο του χρόνου από έκδοση σε έκδοση και τελικά έγινε JAX-WS. Το WS προφανώς σημαίνει WebService και ίσως πιστεύετε ότι πρόκειται απλώς για μια μετονομασία του RPC ως δημοφιλούς λέξης στις μέρες μας. Αυτό δεν είναι αλήθεια, γιατί Τώρα οι υπηρεσίες web έχουν απομακρυνθεί από την αρχική ιδέα και σας επιτρέπουν όχι μόνο να καλείτε απομακρυσμένες μεθόδους, αλλά και να στέλνετε απλά μηνύματα εγγράφων σε μορφή SOAP. Δεν ξέρω γιατί αυτό χρειάζεται ακόμα, είναι απίθανο η απάντηση εδώ να είναι "μόνο σε περίπτωση που χρειαστεί". Εγώ ο ίδιος θα ήθελα να μάθω από πιο έμπειρους συντρόφους. Και τέλος, εμφανίστηκε το JAX-RS για τις λεγόμενες υπηρεσίες RESTful web, αλλά αυτό είναι το θέμα ενός ξεχωριστού άρθρου. Η εισαγωγή μπορεί να τελειώσει εδώ, γιατί... Στη συνέχεια θα μάθουμε να δουλεύουμε με το JAX-WS.

Γενική προσέγγιση

Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η διαδικτυακή μας υπηρεσία και μερικές φορές ονομάζεται τελικό σημείο (όπως, τελικό σημείο, όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:
  1. Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
  2. Εφαρμογή αυτής της διεπαφής
  3. Εκκινήστε την υπηρεσία web μας
  4. Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως την επιθυμητή μέθοδο υπηρεσίας web
Η υπηρεσία Ιστού μπορεί να ξεκινήσει διαφορετικοί τρόποι: είτε να περιγράψετε μια κλάση με μια κύρια μέθοδο και να εκτελέσετε την υπηρεσία Ιστού απευθείας ως διακομιστή, είτε να την αναπτύξετε σε έναν διακομιστή όπως ο Tomcat ή οποιοσδήποτε άλλος. Στη δεύτερη περίπτωση, δεν εκτοξευόμαστε νέος διακομιστήςΚαι δεν ανοίγουμε άλλη θύρα στον υπολογιστή, αλλά απλώς λέμε στο κοντέινερ servlet Tomcat ότι "έχουμε γράψει κλάσεις υπηρεσιών 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).
  • αποστολή των συστοιχιών πελάτη του ίδιου τύπου δεδομένων στον διακομιστή.
Όπως ίσως μαντέψατε, όλη η μαγεία θα γίνει χρησιμοποιώντας την PHP και τις ενσωματωμένες κλάσεις SoapClient και SoapServer. Το κουνέλι μας θα είναι υπηρεσία αποστολής μηνυμάτων SMS.

1 Δήλωση προβλήματος

1.1 Όρια

Στην αρχή προτείνω να ασχοληθούμε με το αποτέλεσμα που θα πετύχουμε στο τέλος του θέματος. Όπως ανακοινώθηκε παραπάνω, θα γράψουμε μια υπηρεσία για την αποστολή μηνυμάτων SMS και πιο συγκεκριμένα, θα λάβουμε μηνύματα από διαφορετικές πηγέςμέσω πρωτοκόλλου SOAP. Μετά από αυτό, θα εξετάσουμε σε ποια μορφή έρχονται στον διακομιστή. Η ίδια η διαδικασία της ουράς μηνυμάτων για περαιτέρω αποστολή στον πάροχο, δυστυχώς, ξεφεύγει από το πεδίο αυτής της ανάρτησηςγια ΠΟΛΛΟΥΣ λογους.

1.2 Ποια δεδομένα θα αλλάξουμε;

Ωραία, αποφασίσαμε για τα όρια! Το επόμενο βήμα που πρέπει να γίνει είναι να αποφασίσουμε ποια δεδομένα θα ανταλλάξουμε μεταξύ του διακομιστή και του πελάτη. Σε αυτό το θέμα, προτείνω να μην χωρίσετε τις τρίχες για πολύ καιρό και να απαντήσετε αμέσως στις κύριες ερωτήσεις για τον εαυτό σας:
  • Ποια ελάχιστα δεδομένα πρέπει να αποστέλλονται στον διακομιστή για να σταλεί ένα μήνυμα SMS σε έναν συνδρομητή;
  • Ποια ελάχιστα δεδομένα πρέπει να αποστέλλονται από τον διακομιστή για να ικανοποιηθούν οι ανάγκες του πελάτη;
Κάτι μου λέει ότι για αυτό πρέπει να στείλεις τα εξής:
  • αριθμός κινητού τηλεφώνου και
  • κείμενο του μηνύματος SMS.
Κατ 'αρχήν, αυτά τα δύο χαρακτηριστικά είναι αρκετά για να τα στείλετε, αλλά φαντάζομαι αμέσως την περίπτωση ενός SMS με ευχές γενεθλίων να σας έρχονται στις 3 η ώρα το πρωί, ή στις 4! Αυτή τη στιγμή, θα είμαι πολύ ευγνώμων σε όλους που δεν με ξέχασαν! Επομένως, θα στείλουμε επίσης στον διακομιστή και
  • ημερομηνία αποστολής του μηνύματος 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,
  • Σε ποια διεύθυνση πρέπει να αποστέλλονται οι κλήσεις πελατών;
Όπως φαίνεται, αυτό το αρχείοκαι υπάρχει ολόκληρη η υπηρεσία web. Καθορίζοντας τη διεύθυνση του αρχείου WSDL στον πελάτη, θα γνωρίζουμε τα πάντα για οποιαδήποτε υπηρεσία web! Ως αποτέλεσμα, δεν χρειάζεται να γνωρίζουμε απολύτως τίποτα για το πού βρίσκεται η ίδια η υπηρεσία web. Το μόνο που χρειάζεται να γνωρίζετε είναι τη θέση του αρχείου WSDL! Σύντομα θα μάθουμε ότι το SOAP δεν είναι τόσο τρομακτικό όσο το λένε οι ρωσικές παροιμίες.

3 Εισαγωγή στο XML-Schema

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

Το κύριο καθήκον του διαγράμματος είναι να περιγράψει τη δομή των δεδομένων που πρόκειται να επεξεργαστούμε. Όλα τα δεδομένα σε σχήματα XML χωρίζονται σε απλός(κλιμακωτός) και συγκρότημα(δομές) τύπους. Οι απλοί τύποι περιλαμβάνουν τους ακόλουθους τύπους:

  • γραμμή,
  • αριθμός,
  • δυαδική τιμή,
  • ημερομηνία της.
Κάτι πολύ απλό που δεν έχει προεκτάσεις μέσα. Ο αντίποδός τους είναι πολύπλοκων σύνθετων τύπων. Το απλούστερο παράδειγμα ενός πολύπλοκου τύπου που έρχεται στο μυαλό όλων είναι τα αντικείμενα. Για παράδειγμα, ένα βιβλίο. Το βιβλίο αποτελείται από ιδιότητες: συγγραφέας, Ονομα, τιμή, Αριθμός ISBNκαι τα λοιπά. Και αυτές οι ιδιότητες, με τη σειρά τους, μπορεί να είναι είτε απλοί τύποι είτε σύνθετοι. Και το καθήκον του σχήματος XML είναι να το περιγράψει αυτό.

Προτείνω να μην πάτε μακριά και να γράψετε ένα σχήμα XML για το μήνυμα SMS μας! Ακολουθεί η xml περιγραφή του μηνύματος SMS:

71239876543 Δοκιμαστικό μήνυμα 20-07-2013 T12:00:00 12
Το διάγραμμα σύνθετου τύπου μας θα μοιάζει με αυτό:


Αυτή η καταχώρηση έχει ως εξής: Έχουμε μια μεταβλητή " μήνυμα"τύπος" Μήνυμα"και υπάρχει ένας πολύπλοκος τύπος που ονομάζεται " Μήνυμα", το οποίο αποτελείται από ένα διαδοχικό σύνολο στοιχείων" τηλέφωνο"τύπος σειρά, « κείμενο"τύπος σειρά, « ημερομηνία"τύπος ημερομηνία ώρα, « τύπος"τύπος δεκαδικός. Αυτοί οι τύποι είναι απλοί και έχουν ήδη οριστεί στην περιγραφή του σχήματος. Συγχαρητήρια! Μόλις γράψαμε το πρώτο μας σχήμα XML!

Νομίζω ότι η έννοια των στοιχείων " στοιχείο" Και " σύνθετος τύπος"Όλα έχουν γίνει λίγο-πολύ ξεκάθαρα σε εσάς, επομένως δεν θα επικεντρωθούμε πλέον σε αυτά και ας περάσουμε κατευθείαν στο στοιχείο του συνθέτη" αλληλουχία" Όταν χρησιμοποιούμε το στοιχείο συνθέτη " αλληλουχία«Σας ενημερώνουμε ότι τα στοιχεία που περιλαμβάνονται σε αυτό πρέπει πάντα να βρίσκονται με τη σειρά που καθορίζεται στο διάγραμμα και όλα είναι υποχρεωτικά. Αλλά μην απελπίζεστε! Υπάρχουν δύο ακόμη στοιχεία συνθέτη στα σχήματα XML: " επιλογή" Και " όλα" συνθέτης" επιλογή" ανακοινώνει ότι πρέπει να υπάρχει ένα από τα στοιχεία που αναφέρονται σε αυτό και ο συνθέτης " όλα» – οποιοσδήποτε συνδυασμός των αναφερόμενων στοιχείων.

Όπως θυμάστε, στην πρώτη ενότητα του θέματος συμφωνήσαμε ότι από ένα έως άπειρα μηνύματα SMS μπορούν να μεταδοθούν σε πακέτο. Επομένως, προτείνω να κατανοήσουμε πώς δηλώνονται τέτοια δεδομένα στο σχήμα XML. Η γενική δομή του πακέτου μπορεί να μοιάζει με αυτό:

71239876543 Δοκιμαστικό μήνυμα 1 20-07-2013 T12:00:00 12 71239876543 Δοκιμαστικό μήνυμα Ν 20-07-2013 T12:00:00 12
Το διάγραμμα για έναν τόσο σύνθετο τύπο θα μοιάζει με αυτό:


Το πρώτο μπλοκ περιέχει τη γνωστή δήλωση του μιγαδικού τύπου " Μήνυμα" Αν προσέξατε, τότε σε κάθε απλό τύπο που περιλαμβάνεται στο " Μήνυμα", προστέθηκαν νέα διευκρινιστικά χαρακτηριστικά " 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. Για να το κάνετε αυτό, μπορείτε είτε απλώς να αντιγράψετε το περιεχόμενό του από την προηγούμενη ενότητα, είτε να αφεθείτε ελεύθεροι και να το κάνετε "πρότυπο" λίγο:

"; ?> /" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http:// schemas.xmlsoap.org/wsdl/http/" name="SmsWsdl" xmlns="http://schemas.xmlsoap.org/wsdl/"> /"> /smsservice.php" />
Σε αυτό το στάδιο, θα πρέπει να είμαστε απόλυτα ικανοποιημένοι με τον διακομιστή που προκύπτει, γιατί Μπορούμε να καταγράψουμε τους φακέλους που έρχονται σε αυτό και στη συνέχεια να αναλύσουμε ήρεμα τα εισερχόμενα δεδομένα. Για να λάβουμε οτιδήποτε στον διακομιστή, χρειαζόμαστε έναν πελάτη. Πάμε λοιπόν σε αυτό!

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
Και αυτό είναι υπέροχο, γιατί... Τώρα γνωρίζουμε με βεβαιότητα ότι ο διακομιστής μας λειτουργεί και όχι μόνο λειτουργεί, αλλά μπορεί επίσης να επιστρέψει ορισμένες τιμές στον πελάτη!

Τώρα ας δούμε το αρχείο καταγραφής που κρατάμε με σύνεση από την πλευρά του διακομιστή! Στο πρώτο του μέρος βλέπουμε τα ανεπεξέργαστα δεδομένα που έφτασαν στον διακομιστή:

79871234567 Δοκιμαστικό μήνυμα 1 21-07-2013 T15:00:00.26 15
Αυτός είναι ο φάκελος. Τώρα ξέρετε πώς μοιάζει! Αλλά είναι απίθανο να ενδιαφερόμαστε να το κοιτάμε συνεχώς, οπότε ας απαριθμήσουμε το αντικείμενο από το αρχείο καταγραφής και να δούμε αν όλα είναι καλά:

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;
Τα αρχεία καταγραφής μας δείχνουν ότι το ακόλουθο πακέτο ελήφθη από τον πελάτη:

79871234567 Δοκιμαστικό μήνυμα 1 21-07-2013 T15:00:00.26 15 79871234567 Δοκιμαστικό μήνυμα 2 22-08-2014T16:01:10 16 79871234567 Δοκιμαστικό μήνυμα 3 22-08-2014T16:01:10 17
Τι ανοησίες λέτε; Και θα έχεις δίκιο από μια άποψη, γιατί... Μόλις μάθαμε ότι ένα αντικείμενο έφυγε από τον πελάτη, ήρθε στον διακομιστή μας με την ίδια ακριβώς μορφή με τη μορφή φακέλου. Είναι αλήθεια ότι τα μηνύματα 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;
Σε αυτήν την περίπτωση, θα λάβουμε έναν άλλο φάκελο:

79871234567 Δοκιμαστικό μήνυμα 1 21-07-2013 T15:00:00.26 15 79871234567 Δοκιμαστικό μήνυμα 2 22-08-2014T16:01:10 16 79871234567 Δοκιμαστικό μήνυμα 3 22-08-2014T16:01:10 17
Μπήκε στη μέθοδο αποστολή 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;
Τι γίνεται αν σταθούμε τυχεροί και βγει το σωστό όνομα από το διάγραμμα; Για να το κάνουμε αυτό, ας δούμε τον φάκελο που έφτασε:

79871234567 Δοκιμαστικό μήνυμα 1 21-07-2013 T15:00:00.26 15 79871234567 Δοκιμαστικό μήνυμα 2 22-08-2014T16:01:10 16 79871234567 Δοκιμαστικό μήνυμα 3 22-08-2014T16:01:10 17
Ναι, δεν έγινε θαύμα! ΨΕΥΔΗΣ- Δεν θα κερδίσουμε! Ήρθε να αποστολή 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">

< ! - Блоки заголовка ->

Στοιχείο

, αν είναι στο μήνυμα, γράφεται πρώτα στο σώμα του στοιχείου . Εκτός από τα χαρακτηριστικά xmlns, μπορεί να περιέχει ένα χαρακτηριστικό actor, το οποίο υποδεικνύει τη διεύθυνση URI του συγκεκριμένου διακομιστή SOAP στον οποίο προορίζεται το μήνυμα.

Το γεγονός είναι ότι ένα μήνυμα 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.

Η τιμή του χαρακτηριστικού ρόλου υποδεικνύει ότι το μπλοκ πρέπει να υποβληθεί σε επεξεργασία από έναν κόμβο που παίζει τον ρόλο που καθορίζεται από την ίδια συμβολοσειρά.

Ένα άλλο χαρακτηριστικό στοιχείου

, που ονομάζεται urnstUnderstand, παίρνει τις τιμές o ή 1. Η προεπιλεγμένη τιμή του είναι o. Εάν το χαρακτηριστικό mustunderstand είναι ίσο με 1, τότε ο κόμβος SOAP, κατά την επεξεργασία του στοιχείου, πρέπει να λάβει υπόψη τη σύνταξή του που ορίζεται στο σχήμα του εγγράφου ή να μην επεξεργάζεται καθόλου το μήνυμα. Αυτό αυξάνει την ακρίβεια της επεξεργασίας μηνυμάτων.

Στην έκδοση 1.2 SOAP, αντί για τον αριθμό o, πρέπει να γράψετε τη λέξη false και αντί για τον αριθμό 1, να γράψετε τη λέξη true.

Στο σώμα της κεφαλίδας

Μπορείτε να ενσωματώσετε αυθαίρετα στοιχεία, που προηγουμένως ονομάζονταν καταχωρήσεις κεφαλίδας. Στην έκδοση 1.2 ονομάζονται μπλοκ κεφαλίδων. Τα ονόματά τους σημειώνονται απαραίτητα με προθέματα. Τα μπλοκ κεφαλίδων μπορεί να περιέχουν χαρακτηριστικά ρόλου ή ηθοποιού και πρέπει να κατανοήσουν χαρακτηριστικά. Η ενέργειά τους θα ισχύει μόνο για αυτό το μπλοκ. Αυτό επιτρέπει την επεξεργασία μεμονωμένων μπλοκ κεφαλίδων από ενδιάμεσους κόμβους SOAP, εκείνους των οποίων ο ρόλος ταιριάζει με τον ρόλο που καθορίζεται από το χαρακτηριστικό ρόλου. Η λίστα 3.1 δείχνει ένα παράδειγμα τέτοιου μπλοκ.

Λίστα 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 στον πελάτη, στο σώμα του οποίου θα γράψει ένα στοιχείο με μήνυμα σφάλματος.

Στο μήνυμα που γράφτηκε στο σώμα ενός στοιχείου SOAP 1.1,

Υπάρχουν τέσσερα μέρη που περιγράφονται από τα ακόλουθα υποστοιχεία.

Κωδικός λάθους - ένα μήνυμα που υποδεικνύει τον τύπο του σφάλματος. Προορίζεται για ένα πρόγραμμα που χειρίζεται σφάλματα.

Περιγραφή του σφάλματος - προφορική περιγραφή του είδους του σφάλματος που προορίζεται για ένα άτομο.

Θέση του σφάλματος - το URI του διακομιστή που παρατήρησε το σφάλμα. Χρήσιμο όταν ένα μήνυμα περνά μέσα από μια αλυσίδα κόμβων SOAP για να διευκρινιστεί η φύση του σφάλματος. Οι ενδιάμεσοι κόμβοι SOAP απαιτούνται για την εγγραφή αυτού του στοιχείου από τον διακομιστή SOAP-στόχου.

Λεπτομέρειες σφάλματος - περιγράψτε τα σφάλματα που συναντώνται στο σώμα μήνυμα, αλλά όχι στον τίτλο του. Εάν δεν εντοπιστούν σφάλματα κατά την επεξεργασία του σώματος, τότε αυτό το στοιχείο λείπει.

Για παράδειγμα:

xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

env:MustUnderstand Σφάλμα πρέπει να κατανοήσει το SOAP

Το SOAP έκδοση 1.2 άλλαξε το περιεχόμενο του στοιχείου Όπως περιγράφεται στο

namespace http://www.w3.org/2002/06/soap-envelope, περιλαμβάνει δύο απαιτούμενα στοιχεία και τρία προαιρετικά στοιχεία.

Απαιτούμενα στοιχεία.

Κωδικός λάθους . Περιέχει ένα απαιτούμενο υποστοιχείο<:value>με κωδικό σφάλματος και προαιρετικό υποστοιχείο , που περιέχει, πάλι, το στοιχείο με διευκρινιστικό κωδικό σφάλματος και στοιχείο , και μετά όλα επαναλαμβάνονται αναδρομικά.

Λόγος λάθους . Περιέχει ένα προαιρετικό χαρακτηριστικό xml: lang, που υποδεικνύει τη γλώσσα του μηνύματος (βλ. Κεφάλαιο Δ) και έναν αυθαίρετο αριθμό ένθετων στοιχείων που περιγράφουν το σφάλμα.

Προαιρετικά στοιχεία.

? - το URI του ενδιάμεσου κόμβου SOAP που παρατήρησε το σφάλμα.

? - ο ρόλος του κόμβου SOAP που παρατήρησε το σφάλμα.

? - περιγραφή του σφάλματος που παρατηρήθηκε κατά την επεξεργασία του σώματος μήνυμα, αλλά όχι τον τίτλο.

Η λίστα 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’>

env:Αποστολέας

rpc:BadArgumentsc/env:Value>

Ptocessing ETror

xmlns:e="http://www.example.org/faults"> Το #εγώ δεν ταιριάζει 999

Τύποι σφαλμάτων

Η λίστα των κωδικών σφαλμάτων αλλάζει και διευρύνεται συνεχώς. Η έκδοση 1.1 ορίζει τέσσερις τύπους σφαλμάτων.

VersionMismatch - ο χώρος ονομάτων δεν αναγνωρίζεται. Μπορεί να είναι ξεπερασμένο ή το όνομά του μπορεί να είναι ανορθόγραφο.

MustUnderstand - Ένα μπλοκ κεφαλίδας που επισημαίνεται με ένα χαρακτηριστικό mustUnderstand με τιμή 1 δεν συμμορφώνεται με τη σύνταξή του όπως ορίζεται στο σχήμα του εγγράφου.

Πελάτης - το έγγραφο XML που περιέχει το μήνυμα έχει λανθασμένη μορφή και για αυτόν τον λόγο ο διακομιστής δεν μπορεί να το επεξεργαστεί. Ο πελάτης πρέπει να αλλάξει το μήνυμα.

Διακομιστής - ο διακομιστής δεν μπορεί να επεξεργαστεί το σωστά ηχογραφημένο μήνυμα για εσωτερικούς λόγους.

Η έκδοση 1.2 ορίζει πέντε τύπους σφαλμάτων.

VersionMismatch - ο χώρος ονομάτων δεν αναγνωρίζεται. Μπορεί να είναι ξεπερασμένο ή το όνομά του να είναι γραμμένο σωστά ή να υπάρχει ένα όνομα στοιχείου XML στο μήνυμα που δεν έχει οριστεί σε αυτόν τον χώρο ονομάτων. Ο διακομιστής γράφει το στοιχείο στην κεφαλίδα απόκρισης , απαριθμώντας ένθετα στοιχεία σωστά ονόματαΧώροι ονομάτων κατανοητοί από τον διακομιστή. Η απόκριση διακομιστή εμφανίζεται στη Λίστα 3.3.

MustUnderstand - Ένα μπλοκ κεφαλίδας που επισημαίνεται με το χαρακτηριστικό mustunderstand που έχει οριστεί σε true δεν συμμορφώνεται με τη σύνταξή του όπως ορίζεται στο σχήμα του εγγράφου. Ο διακομιστής γράφει τα ακόλουθα στοιχεία στην κεφαλίδα απόκρισης: , του οποίου το χαρακτηριστικό qname περιέχει το όνομα του εσφαλμένου μπλοκ. Η καταχώριση 3.4 περιέχει ένα παράδειγμα της απάντησης που θα έκανε ο διακομιστής εάν η κεφαλίδα στη Λίστα 3.1 ήταν ανορθόγραφη.

DataEncodingUnknown - το μήνυμα περιείχε ακατανόητα δεδομένα, ίσως ήταν γραμμένο σε άγνωστη κωδικοποίηση.

Αποστολέας - το έγγραφο XML που περιέχει το μήνυμα έχει λανθασμένη μορφή και για το λόγο αυτό ο διακομιστής δεν μπορεί να το επεξεργαστεί. Ο πελάτης πρέπει να αλλάξει το μήνυμα.

Δέκτης - ο διακομιστής δεν μπορεί να επεξεργαστεί το σωστά ηχογραφημένο μήνυμα για δικούς του εσωτερικούς λόγους, για παράδειγμα, λείπει ο απαιτούμενος αναλυτής XML.

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

αναλύουν τυπικούς τύπους, και μηνύματα σχετικά με αυτά εμφανίζονται στα στοιχεία , όπως φαίνεται παραπάνω στην Λίστα 3.2.

? Λίστα 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/"/>

env:VersionMismatch

Αναντιστοιχία έκδοσης

ListongZ.4. Απόκριση διακομιστή με μήνυμα σφάλματος όπως το MustUnderstand

xmlns:t=’http://some.com/transaction’ />

env:MustUnderstand

Μία ή περισσότερες υποχρεωτικές κεφαλίδες δεν είναι κατανοητές

Βιβλιογραφία:

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 γύρω από το ριζικό στοιχείο.