Περιγραφή των Υπηρεσιών Ιστού σε γλώσσα WSDL. Γλώσσα WSDL. Δομή ενός εγγράφου WSDL. Μέθοδοι δημιουργίας. Τρόποι λειτουργίας WSDL

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

Εισαγωγή

Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως 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. Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως επιθυμητή μέθοδουπηρεσία Ιστού
Μπορείτε να εκκινήσετε μια υπηρεσία Ιστού με διαφορετικούς τρόπους: είτε να περιγράψετε μια κλάση με την κύρια μέθοδο και να εκκινήσετε την υπηρεσία Ιστού απευθείας ως διακομιστής, είτε να την αναπτύξετε σε έναν διακομιστή όπως ο 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ο όρισμα στο χαρακτηριστικό name QName qname = νέο QName ("http://ws.site/" , "HelloWebServiceImplService" ); // Τώρα μπορούμε να φτάσουμε στην ετικέτα υπηρεσίας στην περιγραφή wsdl, Service service = Service. δημιουργία (url, qname) ; // και μετά μέχρι την ετικέτα θύρας που είναι ένθετη σε αυτήν, έτσι ώστε // λάβετε έναν σύνδεσμο προς ένα αντικείμενο υπηρεσίας ιστού που είναι απομακρυσμένο από εμάς HelloWebService γεια = υπηρεσία. getPort(HelloWebService.class); // Ωραία! Τώρα μπορείτε να καλέσετε την απομακρυσμένη μέθοδοΣύστημα. έξω. println (γεια. getHelloString ("JavaRush") ); ) ) Έδωσα τα μέγιστα σχόλια για τον κωδικό στην καταχώριση. Δεν έχω τίποτα να προσθέσω, οπότε ας τρέξουμε (Shift+F10). Θα πρέπει να δούμε το κείμενο στην κονσόλα: Γεια σου, JavaRush! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.

συμπέρασμα

Αυτό το θέμα παρείχε μια σύντομη εκδρομή στις υπηρεσίες Ιστού. Για άλλη μια φορά, θα πω ότι πολλά από αυτά που έγραψα είναι η εικασία μου ως προς το πώς λειτουργεί, και επομένως δεν πρέπει να με εμπιστεύεστε πολύ. Θα ήμουν ευγνώμων αν με διορθώσουν γνώστες, γιατί τότε κάτι θα μάθω. UPD.

Στο Κεφάλαιο 2, συζητήσαμε ότι μετά τη δημιουργία μιας υπηρεσίας Web στον διακομιστή ως servlet, σελίδα JSP, αρχείο JWS, EJB ή άλλο αντικείμενο, θα πρέπει να περιγράψετε τη σύνθεση και τις δυνατότητες της υπηρεσίας Web σε μια γλώσσα ανεξάρτητη από πλατφόρμα, η οποία λειτουργεί σύστημα συστήματος, το σύστημα προγραμματισμού που χρησιμοποιείται για τη δημιουργία της υπηρεσίας Web. Αυτή η περιγραφή καταχωρείται σε μια δημόσια προσβάσιμη τοποθεσία στο Διαδίκτυο, όπως ένα μητρώο UDDI ή ebXML, ή αποθηκεύεται σε διακομιστή υπηρεσιών Web. Η περιγραφή πρέπει να περιέχει πλήρεις και ακριβείς πληροφορίες σχετικά με όλες τις υπηρεσίες που παρέχονται από την υπηρεσία Ιστού, μεθόδους απόκτησης υπηρεσιών, το περιεχόμενο του αιτήματος για την υπηρεσία και τη μορφή των παρεχόμενων πληροφοριών.

Ένα από τα μέσα για την ακριβή και ομοιόμορφη περιγραφή των υπηρεσιών Ιστού είναι η γλώσσα WSDL, που δημιουργήθηκε από την κοινοπραξία W3C. Αυτή η γλώσσα είναι μια άλλη υλοποίηση της XML. Οι πιο πρόσφατες προτεινόμενες προδιαγραφές του δημοσιεύονται πάντα στη σελίδα http://www.w3.org/TR/wsdI. Την εποχή της συγγραφής του βιβλίου, η έκδοση WSDL ήταν 1.2, την οποία θα περιγράψουμε σε αυτό το κεφάλαιο.

Σύνθεση εγγράφου WSDL

Το ριζικό στοιχείο του εγγράφου XML - η περιγραφή WSDL - είναι το στοιχείο . Σε αυτό το στοιχείο, μπορείτε να χρησιμοποιήσετε το προαιρετικό χαρακτηριστικό όνομα για να δώσετε στην περιγραφή ένα όνομα. Είναι επίσης ένα βολικό μέρος για να εισαγάγετε τους χώρους ονομάτων που χρησιμοποιούνται στην περιγραφή.

Οι ορισμοί του WSDL κάνουν εκτενή χρήση διαφόρων χώρων ονομάτων. Εκτός από τα σωστά ονόματα, το WSDL χρησιμοποιεί συχνά τα ονόματα των τύπων και των στοιχείων της γλώσσας ορισμού σχήματος XSD (βλ. Κεφάλαιο 1) και τα ονόματα της γλώσσας του πρωτοκόλλου SOAP. Ο χώρος ονομάτων WSDL συχνά περιγράφεται ως ο προεπιλεγμένος χώρος ονομάτων. Το αναγνωριστικό χώρου ονομάτων της τελευταίας έκδοσης WSDL 1.2 τη στιγμή της σύνταξης ήταν ίσο με http://www.w3.org/2002/07/wsdl. Ο χώρος ονομάτων προορισμού του οποίου το αναγνωριστικό καθορίζεται από το χαρακτηριστικό έχει συνήθως το πρόθεμα tns (χώρος ονομάτων στόχου).

Στο ριζικό στοιχείο στοιχεία από έξι κύρια και δύο πρόσθετους τύπους. Όλα τα στοιχεία είναι προαιρετικά, μπορεί να υπάρχει οποιοσδήποτε αριθμός από αυτά, με εξαίρεση το στοιχείο , το οποίο μπορεί να εμφανιστεί μόνο μία φορά σε ένα έγγραφο. Κάθε στοιχείο έχει ένα όνομα, που καθορίζεται από το απαιτούμενο χαρακτηριστικό name. Τα στοιχεία αναφέρονται το ένα στο άλλο χρησιμοποιώντας αυτά τα ονόματα. Εδώ είναι τα στοιχεία που είναι ένθετα στο ριζικό στοιχείο

? - ορίζει σύνθετους τύπους, που χρησιμοποιείται από την υπηρεσία Web, χρησιμοποιώντας XSD ή άλλη γλώσσα δήλωσης τύπου. Αυτό το στοιχείο δεν είναι απαραίτητο εάν η υπηρεσία Web χρησιμοποιεί μόνο τους απλούς τύπους που περιγράφονται στη γλώσσα XSD.

? - περιγράφει κάθε μήνυμα SOAP: αίτημα, απάντηση, μεταφορά εγγράφου. Αυτό το στοιχείο περιέχει στοιχεία Περιγραφή τμημάτων του μηνύματος που είναι αδιαίρετα από την άποψη του WSDL. Για μηνύματα διαδικαστικού τύπου, κάθε στοιχείο Μπορεί να περιγράψει το όνομα και τον τύπο ενός ορίσματος μεμονωμένου αιτήματος ή τον τύπο μιας τιμής επιστροφής. Για μηνύματα τύπου εγγράφου, στοιχεία Μπορεί να περιγράψει κάθε μέρος του μηνύματος "πολυμερές/σχετικό". Αυτή η αφηρημένη περιγραφή στη συνέχεια εμπλουτίζεται με στοιχεία .

? Περιγράφει τη διεπαφή μιας υπηρεσίας Web, που ονομάζεται τελικό σημείο ή θύρα άφιξης ενός μηνύματος στο WSDL. Περιγράφεται ως ένα σύνολο υπηρεσιών Ιστού, που ονομάζονται λειτουργίες στο WSDL. Μεταφράζοντας αυτήν την περιγραφή σε μια γλώσσα προγραμματισμού, μπορείτε να δείτε ότι η θύρα αντιστοιχίζεται καλά στη διεπαφή Java και κάθε λειτουργία αντιστοιχεί καλά σε μια μέθοδο σε αυτήν τη διεπαφή. Οι λειτουργίες περιγράφονται από ένθετα στοιχεία , περιγράφοντας κάθε μεμονωμένη υπηρεσία. Η υπηρεσία περιγράφεται από ενέργειες που χωρίζονται σε τέσσερις τύπους. Αυτά είναι δύο απλά βήματα: «λήψη μηνύματος», «αποστολή απάντησης» και δύο συνδυασμένες ενέργειες: «αποστολή μηνύματος - λήψη απάντησης» ή, αντίθετα, «λήψη μηνύματος - αποστολή απάντησης». Η λήψη και η αποστολή, με τη σειρά τους, περιγράφονται από ένθετα στοιχεία Και , και το μήνυμα σφάλματος είναι το στοιχείο . Τα μηνύματα που λαμβάνονται και αποστέλλονται πρέπει ήδη να περιγράφονται με στοιχεία , στοιχεία , ΚΑΙ ανατρέξτε σε ΑΥΤΕΣ ΜΕ ΤΗΝ ιδιότητα του μηνύματος ΤΟΥΣ.

? - παραθέτει ένθετα στοιχεία Ένα σύνολο θυρών που σχετίζονται με μια ενιαία υπηρεσία Web. Η ίδια θύρα μπορεί να συσχετιστεί με πολλές υπηρεσίες.

? - περιγράφει τη συγκεκριμένη μορφή για την αποστολή ενός μηνύματος: πρωτόκολλα όπως SOAP ή HTTP, μέθοδοι συσκευασίας του μηνύματος, τον τύπο του περιεχομένου του: HTML, XML ή άλλος τύπος μηνύματος MIME. Κάθε στοιχείο μπορεί να συσχετιστεί με πολλά τέτοια στοιχεία, ένα για κάθε μέθοδο προώθησης. Αυτό το στοιχείο περιέχει στοιχεία που ορίζονται στο επιλεγμένο σχήμα πρωτοκόλλου.

? < service >- καθορίζει τη θέση της υπηρεσίας Web ως μία ή περισσότερες θύρες. Κάθε θύρα περιγράφεται από ένα ένθετο στοιχείο Περιέχει τη διεύθυνση της διεπαφής της υπηρεσίας Web, που καθορίζεται σύμφωνα με τους κανόνες που έχουν επιλεγεί στο στοιχείο Μέθοδος αποστολής.

Εκτός από αυτά τα έξι βασικά στοιχεία, υπάρχουν δύο ακόμη βοηθητικά στοιχεία.

? - περιλαμβάνει ένα αρχείο σχήματος WSDL XSD ή άλλο αρχείο WSDL.

Ενα σχόλιο. Μπορεί να συμπεριληφθεί σε οποιοδήποτε στοιχείο

Περιγραφές WSDL.

Μπορούμε να πούμε ότι τα στοιχεία , Και Δείχνουν ΤΙ έχει η περιγραφόμενη υπηρεσία Ιστού, ποιες υπηρεσίες παρέχει, πώς είναι οργανωμένες οι υπηρεσίες και τι τύπους δεδομένων διαθέτουν αυτές οι υπηρεσίες.

Στοιχεία εξηγήστε ΠΩΣ υλοποιείται η υπηρεσία Ιστού, ποιο είναι το πρωτόκολλο μετάδοσης μηνυμάτων: HTTP, SMTP ή κάποιο άλλο, και επίσης καθορίζει τα τεχνικά χαρακτηριστικά της μετάδοσης δεδομένων.

Τέλος, τα στοιχεία δείτε ΠΟΥ βρίσκεται η υπηρεσία Web, συνδέοντας την περιγραφή με συγκεκριμένες διευθύνσεις υπηρεσιών Web.

Η δομή ενός εγγράφου WSDL φαίνεται στην Λίστα 4.1. Σύμβολα μέσα αγκύλεςδεν περιλαμβάνονται στο έγγραφο. Δείχνουν την επανάληψη ενός στοιχείου ή χαρακτηριστικού σε μια περιγραφή μιας υπηρεσίας Ιστού:

Ο χαρακτήρας [?] σημαίνει ότι το στοιχείο ή το χαρακτηριστικό μπορεί να εμφανίζεται μηδέν ή μία φορά στο έγγραφο.

Το σύμβολο [*] σημαίνει ότι το στοιχείο μπορεί να εμφανίζεται μηδέν ή περισσότερες φορές.

Το σύμβολο [+] ​​σημαίνει ότι το στοιχείο μπορεί να εμφανιστεί μία ή περισσότερες φορές.

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

j Λίστα 4.1. Σχήμα εγγράφων WSDL

targetNamespace="nfleH l ra«iij

location="URI-aflpec" /> [*]

Δωρεάν σχόλιο

Περιγραφές πολύπλοκων και μη τυποποιημένων τύπων.

[*]

[*]

[? ]

Μια αφηρημένη περιγραφή ενός μηνύματος SOAP ως ένα σύνολο από τα συστατικά μέρη του.

[*]

Μια αφηρημένη περιγραφή μιας υπηρεσίας Ιστού ως ένα σύνολο λειτουργιών (υπηρεσιών).

[*]

Περιγραφή της υπηρεσίας ως λήψη (εισαγωγή) και αποστολή (έξοδος, σφάλμα) μηνυμάτων.

[?]

Λήφθηκε μήνυμα.

[?] [?]

Απεσταλμένα

message="nMH αντίστοιχο στοιχείο "> [*] [?]

Το μήνυμα σφάλματος που θα σταλεί.

[*]

[+]

type="MMH του αντίστοιχου στοιχείου "> [*]

[?]

Συγκεκριμένες λεπτομέρειες πρωτοκόλλου. Ορίζονται στο σχήμα

αυτό το πρωτόκολλο. ->

[*]

[?]

Τα στοιχεία που περιγράφουν λεπτομέρειες γράφονται εδώ

συγκεκριμένη λειτουργία. ->

[?]

Στοιχεία που περιγράφουν

λεπτομέρειες του συγκεκριμένου μηνύματος που ελήφθη. ->

[?]

[?]

Στοιχεία που περιγράφουν

λεπτομέρειες του συγκεκριμένου μηνύματος που αποστέλλεται. ->

[*]

[?]

Στοιχεία που περιγράφουν

λεπτομέρειες του συγκεκριμένου μηνύματος σφάλματος. ->

serviceType="MMH του αντίστοιχου στοιχείου "> [*]

Περιγραφή της διεπαφής της υπηρεσίας Web ως ένα σύνολο θυρών.

binding="nMH του αντίστοιχου στοιχείου "> [*]

[?]

Η υποχρεωτική και μοναδική διεύθυνση της διεπαφής της υπηρεσίας Web είναι γραμμένη εδώ, γραμμένη σύμφωνα με τους κανόνες

πρωτόκολλο που καθορίζεται στο στοιχείο . ->

Κάθε συγκεκριμένο πρωτόκολλο μεταφοράς μηνυμάτων - SOAP, HTTP, FTP, SMTP - προσθέτει τα δικά του πρόσθετα στοιχεία στα έξι κύρια και δύο βοηθητικά στοιχεία της γλώσσας WSDL, περιγράφοντας τα χαρακτηριστικά αυτού του πρωτοκόλλου.

Ας δώσουμε ένα απλό παράδειγμα. Στη Λίστα 3.14, γράψαμε μια απλή υπηρεσία Web ως κλάση Java που επιστρέφει το απεσταλμένο αίτημα χωρίς καμία επεξεργασία:

δημόσια τάξη EchoService(

δημόσια συμβολοσειρά getEcho(String req) (Απαιτ. επιστροφής;

Η λίστα 4.2 περιγράφει αυτήν την υπηρεσία Web σε WSDL χρησιμοποιώντας το πρωτόκολλο SOAP.

Λίστα 4.2. Περιγραφή της υπηρεσίας Web EchoService

έκδοση = "1.0" κωδικοποίηση = "UTF-8" ?>

targetNamespace="http://echoservice.com/echoservice.wsdl" xmlns="http://www.w3.org/2002/07/wsdl" xmlns:tns="http://echoservice.com/echoservice.wsdl " xmlns:soap="http://www.w3.org/2002/07/wsdl/soapl2" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

transport="http://schemas.xmlsoap.org/soap/http" />

"http://schemas.xmlsoap.org/soap/encoding/"

namespace= "http://echoservice.ccm/echcservice.wsdl" use="encoded" />

^oapKbocy enccdingStyle=

"http: //schemas .xmlsoap. org/soap/encoding/" namespace= "http: //echoservice. c^/ech^service .wsdl" use="encoded" />

name="EchoServService">

Binding="tns:EchoServiceSoapBinding" name="EchoService"> τοποθεσία=

"http://localhost:8080/axis/EchoService.jws" />

Στην Λίστα 4.2 είμαστε στο στοιχείο ορίσαμε τα προθέματα όλων των χώρων ονομάτων που χρειαζόμαστε. Στη συνέχεια, περιγράψαμε το αίτημα και την απάντηση σε δύο στοιχεία . Τους δώσαμε τα ονόματα "getEchoRequest" ΚΑΙ "getEchoResponse". Το αίτημα έχει ένα επιχείρημα τύπου xsd:σειρά. Αυτός ο τύπος ορίζεται στη γλώσσα XSD. Δώσαμε στο όρισμα το όνομα req, το οποίο είναι ίδιο με το όνομα του ορίσματος της μεθόδου getEcho(). Δώσαμε την τιμή που επιστρέφεται από τη μέθοδο το όνομα return, ο τύπος της είναι επίσης xsd: string.

Τα ονόματα "getEchoRequest" ΚΑΙ "getEchoResponse" ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΣΤΟ ΕΠΟΜΕΝΟ ΣΤΟΙΧΕΙΟ Για να καθορίσετε τις παραμέτρους εισόδου και εξόδου μιας υπηρεσίας Web. Περιέχει ένα στοιχείο . Αυτό σημαίνει ότι η υπηρεσία Web παρέχει μία υπηρεσία της οποίας το όνομα "getEcho" είναι ίδιο με το όνομα της μεθόδου που εκτελεί αυτήν την υπηρεσία. Το στοιχείο καθορίζει την είσοδο και ρεπό παραμέτρους υπηρεσίας. Στη συνέχεια, στοιχείο έχουμε καθορίσει έναν τρόπο προώθησης μηνυμάτων - διαδικαστικού στυλ μηνύματα SOAP που αποστέλλονται μέσω του πρωτοκόλλου HTTP, όπως υποδεικνύεται από το στοιχείο

txarspcrt^=^"ht:tp^://?chepas^.>plscap^.c^rc^/?cap^/ht:tp^" />

Εάν χρησιμοποιείται το στυλ εγγράφου SOAP, το χαρακτηριστικό στυλ ορίζεται σε "document".

Τέλος, στο στοιχείο ένθετο στοιχείο Σύνδεση του στοιχείου με στοιχείο

, υποδεικνύοντας τη διεύθυνση όπου βρίσκεται η υπηρεσία Web.

Στη Λίστα 4.2, τα ονόματα με πρόθεμα σαπούνι καθόρισαν την περιγραφή του μηνύματος και τον τρόπο αποστολής του. Ας δούμε ποια συγκεκριμένα πρωτόκολλα προσφέρει η προδιαγραφή WSDL 1.2.

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

Khabibullin I. Sh. Ανάπτυξη υπηρεσιών Ιστού με χρήση Java. - Αγία Πετρούπολη: BHV-Petersburg, 2003. - 400 σελ.: ill.

Μόλις μου έθεσαν το καθήκον να ξεκινήσω την ανάπτυξη των υπηρεσιών Ιστού και μου έδωσαν τις πηγές ενός απλού έργου χωρίς καμία εξήγηση. Το έργο, φυσικά, δεν ξεκίνησε. Επίσης δεν είχα ιδέα τι ήταν η Άνοιξη και πώς λειτουργούσε. Επίσης, δεν μπόρεσα να βρω επαρκή άρθρα σχετικά με την ανάπτυξη υπηρεσιών Ιστού χρησιμοποιώντας το Spring, είτε στα ρωσικά είτε στα αγγλικά. Έπρεπε να το καταλάβω μόνος μου, αλλά αποδείχθηκε ότι δεν ήταν τόσο τρομακτικό.
Και πρόσφατα αποφάσισα να εξετάσω ποιες νέες δυνατότητες έχουν προστεθεί στο Spring από τότε και να ενημερώσω παλιές υπηρεσίες, κάτι που με ώθησε να γράψω αυτό το άρθρο.

Αυτό το άρθρο είναι ένας οδηγός για την ανάπτυξη μιας απλής υπηρεσίας Web χρησιμοποιώντας το πρωτόκολλο SOAP χρησιμοποιώντας Spring-WS.

Και έτσι, θα γράψουμε την απλούστερη υπηρεσία που δέχεται το όνομα χρήστη και στέλνει χαιρετισμό και την τρέχουσα ώρα στον διακομιστή.

Τι χρειαζόμαστε?
  • IDE. Χρησιμοποιώ το Eclipse.
Προετοιμασία για δουλειά
Ας δημιουργήσουμε ένα νέο έργο εφαρμογής Web. Στο Eclipse είναι: "File => New => Dynamic Web Project".
Ονόμασα το έργο: HelloService.
Στη συνέχεια, αντιγράψτε τις βιβλιοθήκες από τα Spring, XMLBean, wsdl4j, commons-logging στον κατάλογο του έργου WEB-INF/lib.
Εάν θέλετε, μπορείτε να τα προσθέσετε στις βιβλιοθήκες του διακομιστή για να μην τα μεταφέρετε με κάθε εφαρμογή.
Δημιουργία σχήματος WSDL
Ουσιαστικά, ένα σχήμα WSDL έχει σχεδιαστεί για να περιγράφει μια υπηρεσία.
Φυσικά, δεν θα το δημιουργήσουμε χειροκίνητα. Το σχήμα θα δημιουργηθεί αυτόματα χρησιμοποιώντας το Spring, αλλά περισσότερα για αυτό αργότερα.
Καθορισμός δεδομένων εισόδου και εξόδου
Εισαγωγή δεδομένων:
  • Όνομα συμβολοσειράς.
Παραγωγή:
  • Χαιρετισμός εγχόρδων?
  • Ο χρόνος είναι η τρέχουσα ώρα.
Δημιουργία περιγραφής των δεδομένων εισόδου και εξόδου
Στον κατάλογο WEB-INF, δημιουργήστε το αρχείο HelloService.xsd. Αυτό το αρχείοθα χρειαστεί για τη δημιουργία του σχήματος WSDL και τη δημιουργία των αντίστοιχων κλάσεων Java.
Κείμενο αρχείου:

Χαρακτηριστικό targetNamespace– χρησιμοποιούμενος χώρος ονομάτων. Εκείνοι. όλα τα αντικείμενα που δημιουργούνται θα βρίσκονται στο πακέτο org.example.helloService.
Στοιχεία Αίτηση υπηρεσίαςΚαι ServiceResponseπεριγράψτε τα δεδομένα εισόδου και εξόδου (αίτημα/απόκριση) αντίστοιχα.
Γνωρίσματα minΣυμβαίνειΚαι maxOccursπροσδιορίστε τον αριθμό των επαναλήψεων ενός δεδομένου συστατικού σε ένα στοιχείο. Εάν αυτές οι παράμετροι δεν καθορίζονται, τότε από προεπιλογή θεωρούνται ίσες με 1. Για ένα προαιρετικό στοιχείο, πρέπει να καθορίσετε minOccurs=0. Με απεριόριστο αριθμό στοιχείων: maxOccurs=unbounded.
Μπορείτε να διαβάσετε περισσότερα για τα σχήματα XML.
Δημιουργία JavaBeans
Με βάση το σχήμα που δημιουργήθηκε, θα δημιουργήσουμε κλάσεις Java. Για να το κάνετε αυτό, δημιουργήστε ένα αρχείο build.xml:

Παράμετρος WS_HOMEπρέπει να δείχνει στον κατάλογο όπου βρίσκεται το XMLBeans.
HelloService.xsd– διαδρομή προς το κύκλωμα που δημιουργήθηκε.
lib\helloservice.jar– δημιουργία βιβλιοθήκης java.

Στη συνέχεια, εκτελέστε το Ant-build (ελπίζω να το έχετε ήδη εγκαταστήσει).
Στο Eclipse μπορείτε να το εκτελέσετε ως εξής: RMB στο αρχείο build.xml => Run As => Ant Build.
Αν μέσω γραμμή εντολών:
ant -buildfile build.xml
Λοιπόν, περιμένουμε να ολοκληρωθεί η κατασκευή. Μετά από αυτό, μπορούμε να ελέγξουμε τον κατάλογο του έργου WEB-INF\lib για την παρουσία της αντίστοιχης βιβλιοθήκης (helloservice.jar).

Υλοποίηση υπηρεσίας
Δημιουργήστε μια κλάση διεπαφής και υπηρεσίας
Διεπαφή υπηρεσίας: HelloService.java:
πακέτο org.example; εισαγωγή java.util.Calendar; δημόσια διεπαφή HelloService ( δημόσια συμβολοσειρά getHello(όνομα συμβολοσειράς) ρίχνει Εξαίρεση; δημόσιο Ημερολόγιο getCurrentTime(); )
Υλοποίηση υπηρεσίας: HelloServiceImpl.java:
πακέτο org.example; εισαγωγή java.util.Calendar; εισαγωγή org.springframework.stereotype.Service; Δημόσια κλάση @Service Το HelloServiceImpl υλοποιεί το HelloService ( η δημόσια συμβολοσειρά getHello(όνομα συμβολοσειράς) ρίχνει την Εξαίρεση ( επιστροφή "Hello, " + όνομα + "!"; ) δημόσιο Ημερολόγιο getCurrentTime() ( επιστροφή Calendar.getInstance(); ) )
Αυτός ο κώδικας, νομίζω, δεν χρειάζεται σχόλια. Το μόνο πράγμα που μπορεί να εγείρει ερωτήματα για άτομα που δεν έχουν συναντήσει την Άνοιξη στο παρελθόν είναι ο σχολιασμός @ Service, αλλά θα σας πω για αυτό λίγο αργότερα.
Τελικό σημείο
Endpoint – μια κλάση που θα είναι υπεύθυνη για την επεξεργασία των εισερχόμενων αιτημάτων (ένα είδος σημείου εισόδου).

Δημιουργήστε το αρχείο HelloServiceEndpoint.java:
πακέτο org.example; εισαγωγή org.springframework.beans.factory.annotation.Autowired; εισαγωγή org.springframework.ws.server.endpoint.annotation.Endpoint; εισαγωγή org.springframework.ws.server.endpoint.annotation.PayloadRoot; εισαγωγή org.example.helloService.ServiceRequestDocument; εισαγωγή org.example.helloService.ServiceRequestDocument.ServiceRequest; εισαγωγή org.example.helloService.ServiceResponseDocument; εισαγωγή org.example.helloService.ServiceResponseDocument.ServiceResponse; @Endpoint δημόσια κλάση HelloServiceEndpoint( ιδιωτικό στατικό τελικό String namespaceUri = "http://www.example.org/HelloService"; ιδιωτικό HelloService helloService; @Autowired δημόσιο κενό HelloService (HelloService helloService) ( this.helloService = helloService; localPart = "ServiceRequest", namespace = namespaceUri) δημόσιο ServiceResponseDocument getService(ServiceRequestDocument αίτημα) ρίχνει Εξαίρεση ( ServiceRequestDocument reqDoc = αίτημα; ServiceRequest req = reqDoc.getServiceRequest(); ServiceResponseDocument.Response ponse resp = respDoc. addNewServiceResponse();
Τι έχει γίνει εδώ;
σχόλιο @Τέλοςτο καθορίζει επακριβώς αυτή η τάξηθα επεξεργαστεί τα εισερχόμενα αιτήματα.
namespaceUri– ο ίδιος χώρος ονομάτων που καθορίζεται κατά τη δημιουργία του σχήματος xml.

Τώρα ας πάμε λίγο πίσω και ας θυμηθούμε τον σχολιασμό @Υπηρεσία. Χωρίς να μπαίνουμε σε λεπτομέρειες για να μην υπερφορτώνουμε τον αναγνώστη με περιττές πληροφορίες, αυτός ο σχολιασμός λέει στην Spring να δημιουργήσει το κατάλληλο αντικείμενο και τον σχολιασμό @Autowiredχρησιμεύει για έγχυση (αυτόματη αντικατάσταση) του αντίστοιχου αντικειμένου. Φυσικά, κατά τη δημιουργία απλών εφαρμογών, δεν έχει νόημα να χρησιμοποιείτε αυτούς τους σχολιασμούς, αλλά αποφάσισα να μην τους εξαιρέσω σε αυτό το παράδειγμα.

Τα υπόλοιπα, πάλι, όλα πρέπει να είναι ξεκάθαρα. Σημειώστε ότι ServiceRequest, ServiceResponse κ.λπ. – αυτές είναι ακριβώς οι κλάσεις που δημιουργήθηκαν με βάση το σχήμα xml μας.

Διαμόρφωση υπηρεσίας ελατηρίου
Το τέλος πλησιάζει τώρα.
Δημιουργήστε το αρχείο service-ws-servlet.xml.

sws:annotation-driven– αυτό σημαίνει απλώς ότι χρησιμοποιούνται σχολιασμοί σε αυτό το έργο.
ΕΝΑ context:component-scanυποδεικνύει το πακέτο στο οποίο θα αναζητηθούν οι σχολιασμοί και η αναζήτηση θα πραγματοποιηθεί επίσης σε υποπακέτα.

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

sws:dynamic-wsdlείναι υπεύθυνος για την αυτόματη δημιουργία ενός εγγράφου WSDL που βασίζεται στο δημιουργημένο σχήμα XML.
τοποθεσίαυποδεικνύει τη διαδρομή προς το σχήμα.
τοποθεσίαUri– τη διεύθυνση (σε σχέση με το κοντέινερ) όπου θα είναι διαθέσιμο το σχήμα WSDL.
Στην περίπτωσή μου το WSDL είναι διαθέσιμο στην ακόλουθη διεύθυνση:
localhost/HelloService/HelloService.wsdl

Περιγραφέας ανάπτυξης
Και τέλος, το τελευταίο.
Στον κατάλογο WEB-INF αλλάζουμε ή δημιουργούμε το αρχείο web.xml.
HelloService HelloService service-ws org.springframework.ws.transport.http.MessageDispatcherServlet transformWsdlΤοποθεσίες αληθής service-ws /*
Δεν θα περιγράψω πια αυτό το αρχείο. Για απλά έργα, ουσιαστικά δεν πρέπει να αλλάξει. Αξίζει μόνο να σημειωθεί ότι το όνομα servlet (servlet-name) πρέπει να ταιριάζει με το όνομα του αρχείου διαμόρφωσης υπηρεσίας Spring service-ws-servlet.xml.
Έλεγχος λειτουργικότητας
Το πρώτο κιόλας σημάδι σωστή λειτουργίαείναι το δημιουργημένο σχήμα WSDL.
Για να ελέγξετε, απλώς μεταβείτε στη διεύθυνση αυτού του σχήματος (http://localhost/HelloService/HelloService.wsdl) και δείτε: το αρχείο xml θα πρέπει να εμφανίζεται εκεί. Εάν δεν εμφανίζεται τίποτα ή εμφανίζεται κάποιο σφάλμα, διαβάστε ξανά προσεκτικά ολόκληρο το άρθρο και αναζητήστε τι κάναμε λάθος.

Για περαιτέρω δοκιμές χρειαζόμαστε soapUI (έχω την έκδοση 3.0.1).
Εγκαταστήστε το και εκκινήστε το.
Δημιουργήστε ένα νέο έργο: Αρχείο => Νέο έργο soapUI. Στο πεδίο Initial WSDL/WADL, εισαγάγετε έναν σύνδεσμο προς το σχήμα WSDL (http://localhost/HelloService/HelloService.wsdl).
Στο έργο που δημιουργήθηκε, ανοίξτε το απαιτούμενο αίτημα.

Εισαγάγετε το όνομα στο πεδίο Όνομα και κάντε κλικ στο κουμπί «Αποστολή αιτήματος».


Ως αποτέλεσμα, λαμβάνουμε μια απάντηση από τον διακομιστή με έναν χαιρετισμό και την τρέχουσα ώρα.


Αν κάτι πάει στραβά, διαβάστε ξανά αυτό το άρθρο.

Τι έπεται?
Λοιπόν, το επόμενο βήμα είναι να γράψετε έναν πελάτη για αυτήν την υπηρεσία Web. Αλλά αυτό είναι ήδη υλικό για ένα άλλο άρθρο, το οποίο μπορεί να γραφτεί αργότερα, εάν αυτό το υλικόκάποιος θα ενδιαφερθεί.

Πώς ορίζει το WSDL 1.1 τις υπηρεσίες Ιστού και πώς να δημιουργείτε μοντέλα χρησιμοποιώντας Γλώσσα Javaγια επαλήθευση και μετατροπή εγγράφων WSDL

Σειρά περιεχομένου:

Σχετικά με αυτήν τη σειρά άρθρων

Οι υπηρεσίες Ιστού είναι ένα σημαντικό χαρακτηριστικό Τεχνολογίες Java™ στο Enterprise Computing. Σε αυτή τη σειρά άρθρων, ο σύμβουλος υπηρεσιών XML και Web Denis Sosnovsky μιλά για τις κύριες δομές και τεχνολογίες πολύτιμες για τους προγραμματιστές Java που χρησιμοποιούν υπηρεσίες Ιστού. Ακολουθήστε τα άρθρα της σειράς για να μείνετε ενημερωμένοι με τις τελευταίες εξελίξεις σε αυτόν τον τομέα και να ξέρετε πώς να τις εφαρμόζετε στα δικά σας έργα.

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

Προσφέρθηκαν διάφορες μεθόδουςορισμούς των υπηρεσιών Ιστού, αλλά η πιο ευρέως χρησιμοποιούμενη προσέγγιση παραμένει η WSDL 1.1. Το WSDL 1.1 έχει κάποιες ελλείψεις, συμπεριλαμβανομένης μιας υπερβολικά περίπλοκης δομής που καθιστά δύσκολη την ανάγνωση για τους μη μυημένους. Υποφέρει επίσης από την έλλειψη έγκυρου επίσημου ορισμού, ο οποίος οδήγησε σε διαδοχικές «διευκρινίσεις» που καλύπτουν ορισμένα από τα κενά αυθεντικό έγγραφοΠροδιαγραφές. Ως αποτέλεσμα, οι στοίβες υπηρεσιών Web προσπαθούν να χειριστούν έγγραφα WSDL 1.1 όσο το δυνατόν πιο ευέλικτα. Αυτή η ευελιξία μπορεί να προσθέσει στη σύγχυση στην κατανόηση του WSDL 1.1, καθώς οι προγραμματιστές βλέπουν ένα ευρύ φάσμα δομών WSDL χωρίς καμία ένδειξη για το ποια προσέγγιση είναι προτιμότερη.

Σε αυτό το άρθρο, θα σας δείξουμε πώς να αναλύετε έγγραφα WSDL 1.1 και θα εξετάσουμε τα πρώτα μέρη του μοντέλου Java για την επικύρωση εγγράφων WSDL και τη μετατροπή τους σε τυπική μορφή.

Ανάλυση WSDL 1.1

Χρησιμοποιούνται χώροι ονομάτων

Αυτό το άρθρο χρησιμοποιεί:

  • Το πρόθεμα wsdl για την αναπαράσταση του χώρου ονομάτων WSDL 1.1 http://schemas.xmlsoap.org/wsdl/ ;
  • το πρόθεμα σαπουνιού για τον χώρο ονομάτων http://schemas.xmlsoap.org/wsdl/soap/ που χρησιμοποιείται από την επέκταση SOAP 1.1 για το WSDL 1.1.
  • Πρόθεμα xs για τον χώρο ονομάτων http://www.w3.org/2001/XMLSchema που χρησιμοποιείται για ορισμούς σχημάτων XML.

Η αναθεώρηση 1.1 του WSDL, που δημοσιεύτηκε στις αρχές του 2001, έχει αντικατασταθεί τεχνικά από τις συστάσεις του W3C WSDL 2.0, που δημοσιεύθηκαν το 2007. Το WSDL 2.0 προσφέρει καθαρότερη δομή από το WSDL 1.1 μαζί με μεγαλύτερη ευελιξία. Αλλά το WSDL 2.0 πάσχει από ένα πρόβλημα με το κότα και το αυγό: το WSDL 2.0 δεν χρησιμοποιείται ευρέως επειδή δεν υποστηρίζεται ευρέως και επειδή δεν χρησιμοποιείται ευρέως, οι προγραμματιστές στοίβων υπηρεσιών Ιστού έχουν λίγα κίνητρα να το υποστηρίξουν. Παρά όλες τις αδυναμίες του, το WSDL 1.1 είναι αρκετά καλό για τους περισσότερους σκοπούς.

Η αρχική προδιαγραφή WSDL 1.1 ήταν ανακριβής όσον αφορά τον αριθμό των λειτουργιών που χρησιμοποιήθηκαν. Επειδή το επίκεντρο του WSDL ήταν να συνεργαστεί με ορισμούς υπηρεσιών SOAP, περιλάμβανε επίσης υποστήριξη για χαρακτηριστικά SOAP (όπως η κωδικοποίηση rpc) που αργότερα αποδείχτηκε ανεπιθύμητη. Οργάνωση Διαδικτυακές υπηρεσίεςΟ Οργανισμός Διαλειτουργικότητας (WS-I) έλυσε αυτά τα προβλήματα στο Βασικό προφίλ(BP), η οποία παρέχει πρακτική καθοδήγηση σχετικά με τις υπηρεσίες Ιστού που χρησιμοποιούν SOAP και WSDL. Το BP 1.0 εγκρίθηκε το 2004 και το BP 1.1 κυκλοφόρησε το 2006. Αυτό το άρθρο καλύπτει το WSDL 1.1 με βάση τις συστάσεις του WS-I BP και δεν αγγίζει τις πραγματικές λειτουργίες που έχουν καταργηθεί, όπως η κωδικοποίηση rpc για το SOAP.

Η δομή των εγγράφων XML θεωρείται ότι καθορίζεται από τους ορισμούς του σχήματος XML. Η αρχική προδιαγραφή WSDL 1.1 περιελάμβανε μια περιγραφή του σχήματος, αλλά το σχήμα δεν ταιριάζει με τις περιγραφές κειμένου από πολλές απόψεις. Αυτό διορθώθηκε αργότερα στο τροποποιημένη έκδοσησχήμα, αλλά το έγγραφο WSDL 1.1 δεν επεξεργάστηκε για να αντικατοπτρίζει αυτήν την αλλαγή. Η ομάδα BP WS-I αποφάσισε στη συνέχεια να κάνει ακόμη περισσότερες αλλαγές στο σχήμα WSDL και δημιούργησε αυτό που διαφημίζεται ως πρακτικές οδηγίες για αυτό το ολισθηρό σχήμα. Τα έγγραφα που γράφτηκαν για μια έκδοση ενός σχήματος γενικά δεν είναι συμβατά με άλλες εκδόσεις (παρά τη χρήση του ίδιου χώρου ονομάτων), αλλά ευτυχώς τα περισσότερα εργαλεία υπηρεσιών Ιστού αγνοούν σε μεγάλο βαθμό το σχήμα και αποδέχονται οτιδήποτε φαίνεται λογικό. (Δείτε συνδέσμους προς πολλά σχήματα WSDL στην ενότητα).

Ακόμη και η έκδοση BP WS-I του σχήματος WSDL 1.1 δεν κάνει πολλά για να διασφαλίσει τη συμμόρφωση με τις προδιαγραφές των εγγράφων WSDL 1.1. Το διάγραμμα δεν αντικατοπτρίζει όλους τους περιορισμούς του WS-I BP, ειδικά όσον αφορά τη σειρά εξαρτημάτων. Επιπλέον, το σχήμα XML δεν είναι σε θέση να χειριστεί πολλούς τύπους περιορισμών που ορίζονται εύκολα σε έγγραφα (όπως εναλλακτικά χαρακτηριστικά ή απαιτούμενα πρόσθετα στοιχεία από ένα ξεχωριστό σχήμα). Επομένως, η επαλήθευση ότι ένα έγγραφο WSDL 1.1 συμμορφώνεται με την προδιαγραφή WSDL 1.1 (όπως τροποποιήθηκε από το BP WS-I) περιλαμβάνει πολύ περισσότερα από την απλή εκτέλεση επικύρωσης σχήματος XML. Θα επιστρέψουμε σε αυτό το θέμα αργότερα σε αυτό το άρθρο. Αλλά πρώτα, ας δούμε τη δομή των περιγραφών υπηρεσιών WSDL 1.1.

Περιγραφή Στοιχεία

Τα έγγραφα WSDL 1.1 χρησιμοποιούν ένα σταθερό, εύχρηστο ριζικό στοιχείο . Μέσα σε αυτό το ριζικό στοιχείο, ο χώρος ονομάτων WSDL 1.1 ορίζει ένα "παθητικό" θυγατρικό στοιχείο (απλώς μια σύνδεση με μεμονωμένα έγγραφα WSDL 1.1) και πέντε "ενεργά" θυγατρικά στοιχεία (τα οποία στην πραγματικότητα αποτελούν την περιγραφή της υπηρεσίας):

  • αναφέρεται σε χωριστό έγγραφο WSDL 1.1 με περιγραφές που πρέπει να περιλαμβάνονται σε αυτό το έγγραφο.
  • ορίζει τύπους ή στοιχεία XML που χρησιμοποιούνται για την ανταλλαγή μηνυμάτων.
  • ορίζει το πραγματικό μήνυμα ως προς τους τύπους ή στοιχεία XML;
  • ορίζει ένα αφηρημένο σύνολο λειτουργιών που εκτελούνται από την υπηρεσία.
  • καθορίζει την πραγματική υλοποίηση χρησιμοποιώντας συγκεκριμένα πρωτόκολλα και μορφές·
  • ορίζει την υπηρεσία ως σύνολο, συνήθως περιλαμβάνει ένα ή περισσότερα στοιχεία με πληροφορίες πρόσβασης για στοιχεία .

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

Για πλήρη περιγραφή της υπηρεσίας, κατά κανόνα, απαιτείται τουλάχιστον, ένα στοιχείο καθενός από αυτούς τους τύπους, εκτός , αλλά δεν χρειάζεται να βρίσκονται όλα στο ίδιο έγγραφο. Για να συναρμολογήσετε ένα πλήρες WSDL από πολλά έγγραφα, μπορείτε να χρησιμοποιήσετε , το οποίο επιτρέπει την υποδιαίρεση των περιγραφών ανάλογα με τις ανάγκες του οργανισμού. Για παράδειγμα, τα τρία πρώτα στοιχεία της περιγραφής ( , Και ) μαζί συνθέτουν Πλήρης περιγραφήδιεπαφή υπηρεσίας (ίσως ορίζεται από την ομάδα αρχιτεκτονικής), επομένως είναι λογικό να διατηρούνται χωριστά από στοιχεία που προσανατολίζονται στην υλοποίηση Και . Όλες οι μεγάλες στοίβες υπηρεσιών Ιστού υποστηρίζουν τον διαχωρισμό των περιγραφών σε πολλαπλά έγγραφα WSDL.

Η λίστα 1 δείχνει ένα παράδειγμα περιγραφής υπηρεσίας WSDL που χωρίζεται σε δύο έγγραφα WSDL, έτσι ώστε τα στοιχεία περιγραφής της διεπαφής να περιέχονται στο αρχείο BookServerInterface.wsdl και τα στοιχεία υλοποίησης στο αρχείο BookServerImpl.wsdl. Η λίστα 1 εμφανίζει το BookServerInterface.wsdl.

Καταχώριση 1. BookServerInterface.wsdl
Ορισμός διεπαφής υπηρεσίας βιβλίου. ... ... Υλοποίηση υπηρεσίας βιβλίου. Αυτό δημιουργεί μια αρχική βιβλιοθήκη βιβλίων κατά τη φόρτωση της τάξης και, στη συνέχεια, υποστηρίζει κλήσεις μεθόδων για πρόσβαση στις πληροφορίες της βιβλιοθήκης (συμπεριλαμβανομένης της προσθήκης νέων βιβλίων). Αποκτήστε το βιβλίο με ένα συγκεκριμένο ISBN. ... Προσθήκη νέου βιβλίου.

Η λίστα 2 δείχνει το BookServerImpl.wsdl. Στοιχείο στην αρχή εισάγει την περιγραφή διεπαφής BookServerInterface.wsdl.

Καταχώριση 2. BookServerImpl.wsdl
Ορισμός της πραγματικής εφαρμογής της υπηρεσίας βιβλίου. ...

Εκτός από τους ορισμούς στοιχείων (και χαρακτηριστικών) στον χώρο ονομάτων WSDL 1.1, το WSDL 1.1 ορίζει επίσης πρόσθετα στοιχεία. Προορίζονται να γεμίσουν συγκεκριμένα κελιά στις περιγραφές υπηρεσιών WSDL 1.1 για μετάδοση Επιπλέον πληροφορίεςαπαιτείται για συγκεκριμένο τύπο υπηρεσίας. Τα μόνα πρόσθετα στοιχεία WSDL 1.1 που εξακολουθούν να χρησιμοποιούνται ευρέως είναι οι συνδέσεις για το SOAP 1.1 (αυτές εισάγονται στο , στα στοιχεία Και ), τα οποία ορίστηκαν στην αρχική προδιαγραφή WSDL 1.1 και για το SOAP 1.2, που ορίστηκε από ξεχωριστή προδιαγραφή το 2006.

Στοιχεία εξαρτήματος

Στοιχείο περιέχει όλους τους ορισμούς XML που χρησιμοποιούνται για μηνύματα, ως ένα ή περισσότερα στοιχεία . (Το WSDL επιτρέπει εναλλακτικές λύσεις σχήματος XML για αυτούς τους ορισμούς, αλλά οι περισσότερες στοίβες υποστηρίζουν μόνο σχήματα XML.) Εάν είναι απαραίτητο, στοιχεία μπορεί να χρησιμοποιηθεί ή για να συμπεριλάβετε άλλα σχήματα εκτός του WSDL (καθώς και ανατρέξτε σε ξεχωριστά σχήματα εντός του ίδιου WSDL).

Αφού ένα στοιχείο μπορεί να περιέχει οποιονδήποτε αριθμό ορισμών σχήματος, δεν υπάρχει λόγος να χρησιμοποιηθούν περισσότερα από ένα στοιχεία σε ένα έγγραφο WSDL . Στο στοιχείο βρίσκεται στην κορυφή του BookServerInterface.wsdl.

εκτός Και , σε όλα τα στοιχεία ανώτατου επιπέδου ενός εγγράφου WSDL δίνονται μεμονωμένα ονόματα χρησιμοποιώντας το απαιτούμενο χαρακτηριστικό name. Όταν χρησιμοποιείτε το χαρακτηριστικό targetNamespace στο ριζικό στοιχείο έγγραφο (το οποίο είναι συνήθως το καλύτερο), τα ονόματα αυτών των στοιχείων ορίζονται σε αυτόν τον χώρο ονομάτων προορισμού. Αυτό σημαίνει ότι κατά τον ορισμό ενός ονόματος, αρκεί να εκχωρήσετε το απλό ή "τοπικό" μέρος του ονόματος, αλλά οι αναφορές σε αυτό το στοιχείο πρέπει να χαρακτηρίζουν το όνομα χρησιμοποιώντας ένα πρόθεμα χώρου ονομάτων ή χρησιμοποιώντας έναν προεπιλεγμένο χώρο ονομάτων. Το σχήμα 1 δείχνει τους πιο σημαντικούς συνδέσμους μεταξύ των στοιχείων WSDL, με συμπαγείς γραμμές που αντιπροσωπεύουν συνδέσμους με πλήρες όνομα και διακεκομμένες γραμμές που αντιπροσωπεύουν συνδέσμους με όνομα που χρησιμοποιούνται για αναγνώριση χωρίς χαρακτηρισμό χώρου ονομάτων.

Εικόνα 1. Σχέσεις μεταξύ των στοιχείων WSDL

Μηνύματα που αντιπροσωπεύονται από στοιχεία , βρίσκονται στον πυρήνα των περιγραφών υπηρεσιών WSDL. Στοιχεία είναι περιγραφές δεδομένων XML που μεταφέρονται μεταξύ του πελάτη και του παρόχου υπηρεσιών. Κάθε στοιχείο περιέχει μηδέν ή περισσότερα (συνήθως ένα) θυγατρικά στοιχεία . Κάθε στοιχείο τμήματος απαιτεί τη δική του ιδιότητα ονόματος (μοναδικό εντός ) και ένα από τα χαρακτηριστικά του στοιχείου ή του τύπου που αναφέρεται στον ορισμό του σχήματος δεδομένων XML. Πολλαπλά στοιχεία εμφανίζεται στο , μετά το στοιχείο στο BookServerInterface.wsdl.

Στοιχεία ορίστε μια αφηρημένη διεπαφή υπηρεσίας ως προς τα μηνύματα που αποστέλλονται και λαμβάνονται από την υπηρεσία. Στοιχεία περιέχει οποιοδήποτε αριθμό θυγατρικών στοιχείων . Κάθε παιδί στοιχείο απαιτεί το δικό του χαρακτηριστικό ονόματος (το WS-I BP απαιτεί να είναι μοναδικό εντός ), και περιέχει ένα ή περισσότερα θυγατρικά στοιχεία που περιγράφουν τα μηνύματα που χρησιμοποιούνται από τη λειτουργία. Τα παιδικά στοιχεία διατίθενται σε τρεις τύπους, που αντιστοιχούν σε με διαφορετικούς τρόπουςχρήσεις:

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

Το WSDL 1.1 ορίζει πολλά μοτίβα αλληλεπίδρασης μεταξύ ενός πελάτη και ενός παρόχου υπηρεσιών, που αντιπροσωπεύονται από διάφορες ακολουθίες θυγατρικών στοιχείων Και , αλλά δεν είναι όλα τα μοντέλα αρκετά καλά καθορισμένα για να εφαρμοστούν. Το BP WS-I επιτρέπει μόνο δύο μοντέλα: λειτουργίες αιτήματος-απόκρισης, όπου πρέπει , και μονόδρομες λειτουργίες που περιέχουν μόνο . Στην περίπτωση λειτουργιών αιτήματος-απόκρισης (μακράν ο πιο συνηθισμένος τύπος) πίσω από τα στοιχεία Και μπορεί να ακολουθείται από οποιονδήποτε αριθμό στοιχείων .

Κάθε στοιχείο , ή αναφέρεται σε μια περιγραφή μηνύματος μέσω του απαιτούμενου χαρακτηριστικού μηνύματος. Αυτή είναι μια ειδική αναφορά χώρου ονομάτων, επομένως συνήθως απαιτεί την προσθήκη ενός προθέματος. Παραδείγματα μπορούν να φανούν σε: για παράδειγμα, όταν ένα στοιχείο χρησιμοποιείται στην περιγραφή της λειτουργίας getBook. (Το πρόθεμα tns χρησιμεύει ως ορισμός του ριζικού στοιχείου με το ίδιο URI χώρου ονομάτων με το χαρακτηριστικό targetNamespace.)

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

Σύγκριση SOAP 1.1 και 1.2

Το SOAP 1.1 έχει χρησιμοποιηθεί ευρέως για υπηρεσίες Ιστού από τη δημοσίευση της προδιαγραφής το 2000. Το SOAP 1.2 αναπτύχθηκε με ευρύτερη βιομηχανική υποστήριξη μέσω του W3C και δημοσιεύτηκε ως επίσημο πρότυπο του W3C το 2007. Το SOAP 1.2 είναι καλύτερα τεκμηριωμένο και πιο καθαρό από το SOAP 1.1, με ορισμένες από τις άσχημες πτυχές του 1.1 να αφαιρούνται χειρουργικά. Παρά αυτή την καθαρή δομή, για τις περισσότερες υπηρεσίες Ιστού υπάρχει μικρή πρακτική διαφορά μεταξύ τους. Ίσως το πιο σημαντικό χαρακτηριστικό του SOAP 1.2 είναι ότι είναι ο μόνος επίσημα υποστηριζόμενος τρόπος αξιοποίησης της ενισχυμένης υποστήριξης του SOAP για συνημμένα XML-binary Optimized Packaging (XOP) και SOAP Message Transmission Optimization Mechanism (MTOM). Σε βρόχο Υπηρεσίες Ιστού JavaΧρησιμοποιώ το SOAP 1.1 μέχρι στιγμής επειδή ορισμένες παλαιότερες στοίβες δεν υποστηρίζουν το SOAP 1.2, αλλά για την ανάπτυξη νέων υπηρεσιών Ιστού, το 1.2 είναι πιθανώς καλύτερη επιλογή.

Στοιχεία αντιπροσωπεύουν ένα παράδειγμα μιας αφηρημένης διεπαφής που ορίζεται , το οποίο είναι ορατό στην αρχή του BookServerImpl.wsdl. Το χαρακτηριστικό type περιέχει το πλήρως αναγνωρισμένο όνομα του τύπου θύρας που εφαρμόζεται στη δέσμευση.

Παιδικά στοιχεία περιέχω λεπτομερείς πληροφορίεςσχετικά με τον τρόπο υλοποίησης του τύπου θύρας. Τα θυγατρικά στοιχεία από τον χώρο ονομάτων WSDL αντιστοιχούν σε στοιχεία και θα πρέπει να χρησιμοποιεί την ίδια τιμή ονόματος – αλλά όχισυνδέσμους με διευκρίνιση χώρου ονομάτων, όπως στην περίπτωση . αυτή η σύνδεση φαίνεται με διακεκομμένες γραμμές στο επίπεδο . Η ίδια σχέση με το όνομα ισχύει και για τα θυγατρικά στοιχεία / / στοιχεία . Παρόλα αυτά επαναχρησιμοποίησητα ίδια ονόματα στοιχείων, το περιεχόμενο αυτών των στοιχείων διαφέρει σημαντικά όταν είναι θυγατρικά στοιχεία , όχι το στοιχείο .

Οι επεκτάσεις που ορίζονται από το WSDL μπαίνουν στο παιχνίδι . Παιδικό στοιχείο χρησιμοποιείται σε έναν ορισμό υπηρεσίας SOAP (ο μόνος τύπος υπηρεσίας που επιτρέπεται από το WS-I BP, αν και το WSDL 1.1 επιτρέπει επίσης δεσμεύσεις HTTP). Αυτό το αντικείμενο χρησιμοποιεί το απαιτούμενο χαρακτηριστικό μεταφοράς για να καθορίσει τον τύπο μεταφοράς που χρησιμοποιείται από τη δέσμευση. (Το HTTP, όπως φαίνεται στην τιμή http://schemas.xmlsoap.org/soap/http στο , είναι η μόνη επιλογή που επιτρέπεται από το WS-I BP.) Το προαιρετικό χαρακτηριστικό στυλ σάς επιτρέπει να επιλέξετε μεταξύ του στυλ rpc και του εγγράφου για την αναπαράσταση δεδομένων XML (η πιο κοινή τιμή του εγγράφου αντιστοιχεί σε μηνύματα που χρησιμοποιούν στοιχεία ορισμού σχήματος αντί για τύπο).

Μέσα σε κάθε παιδικό στοιχείο στοιχείο στοιχείο μπορεί να χρησιμοποιηθεί για τον καθορισμό μιας τιμής SOAPAction για τον προσδιορισμό αιτημάτων για την κλήση αυτής της λειτουργίας (και ενδεχομένως επίσης για την παράκαμψη της επιλογής του εγγράφου ή του στυλ rpc καθορίζεται από το στοιχείο , αν και η BP WS-I απαγορεύει τέτοια χρήση). Κάθε παιδί στοιχείο / / περιέχει ένα άλλο πρόσθετο στοιχείο, το οποίο είναι πάντα στοιχείο (που υποδεικνύει ότι αυτά τα μηνύματα αποστέλλονται στο σώμα Μηνύματα SOAP– δεδομένα και ακόμη και σφάλματα μπορούν επίσης να σταλούν σε κεφαλίδες SOAP, αν και δεν το συνιστώ) για ή , ή το αντίστοιχο , χρησιμοποιείται με .

Το τελευταίο στοιχείο της περιγραφής της υπηρεσίας WSDL είναι το στοιχείο , που αποτελείται από μια ομάδα στοιχείων . Κάθε στοιχείο συσχετίζει τη διεύθυνση πρόσβασης με . Η διεύθυνση πρόσβασης περιέχεται σε ένα ένθετο πρόσθετο στοιχείο .

Εργασία με WSDL

Δεν προκαλεί έκπληξη το γεγονός ότι με όλες τις παραλλαγές στα σχήματα και τους κανόνες για έγγραφα WSDL 1.1, πολλά έγγραφα δεν συμμορφώνονται με τις βέλτιστες πρακτικές της BP WS-I. Η υποστήριξη πολλών αποκλίσεων από τις βέλτιστες πρακτικές σε όλες τις στοίβες υπηρεσιών Ιστού συνέβαλε στη διαιώνιση της χρήσης απαρχαιωμένων ή εσφαλμένων σχεδίων, οδηγώντας στη διάδοση κακών πρακτικών σε ολόκληρο τον κλάδο. Και σίγουρα δεν έχω ανοσία σε αυτή τη μόλυνση - ενώ κοιτάζω τα έγγραφα WSDL που παρείχα ως παραδείγματα κώδικα για αυτήν τη σειρά, με έκπληξη διαπίστωσα ότι κανένα από αυτά δεν ήταν απολύτως σωστό.

Έτσι, όταν αποφάσισα να γράψω αυτό το άρθρο, σκέφτηκα ότι θα ήταν ωραίο να συμπεριλάβω ένα εργαλείο που σας επιτρέπει να ελέγχετε τα έγγραφα WSDL σε σχέση με τις βέλτιστες πρακτικές. Φαίνεται ότι αυτό απέχει μόλις ένα βήμα από τη μετατροπή εγγράφων WSDL στη σωστή μορφή, υπό την προϋπόθεση ότι το αρχικό WSDL δεν περιέχει σφάλματα. Αλλά υπήρχε πολύ περισσότερη δουλειά από αυτή που είχα αρχικά σχεδιάσει, και πλήρεις πληροφορίεςΘα συμπεριλάβω πληροφορίες για αυτό το μοντέλο στα επόμενα δύο άρθρα αυτής της σειράς.

Για να εργαστείτε με έγγραφα WSDL στη γλώσσα Java, πολλά διάφορα μοντέλα, συμπεριλαμβανομένης μιας ευρέως χρησιμοποιούμενης γλώσσας περιγραφής υπηρεσιών Ιστού για Java Toolkit(WSDL4J), το οποίο είναι μια υλοποίηση αναφοράς του JSR 110 (βλ. ενότητα ). Κανένα από αυτά τα μοντέλα δεν ταιριάζει με αυτό που είχα σκοπό να κάνω, λόγω της διπλής φύσης του προβλήματος: πρώτον, ανάγνωση εγγράφων WSDL σε οποιαδήποτε ημι-έξυπνη μορφή και αναφορά σφαλμάτων και αποκλίσεων από τις βέλτιστες πρακτικές, και δεύτερον, σύνταξη WSDL χωρίς σφάλματα. εγγράφων που έχουν αναμορφοποιηθεί σε μορφή συμβατή με πρακτικές συστάσεις. Το WSDL4J, για παράδειγμα, δεν διατηρεί τη σειρά των στοιχείων εισόδου, έτσι ώστε να μπορούν να αναφέρονται προβλήματα παραγγελίας και δεν χειρίζεται ορισμούς σχημάτων, ώστε να μην μπορεί να χρησιμοποιηθεί απευθείας για τον έλεγχο αναφορών από στοιχεία . Έπρεπε λοιπόν να διαλέξω ανάμεσα σε μια πιο ρεαλιστική δήλωση προβλήματος και να γράψω το δικό μου μοντέλο. Όπως ήταν φυσικό, αποφάσισα να γράψω το δικό μου μοντέλο.

Μοντέλο WSDL

Επικύρωση και επαλήθευση

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

Στο παρελθόν έχω εφαρμόσει εν μέρει ένα μοντέλο WSDL για χρήση με σύνδεση δεδομένων JiBX ως μέρος του έργου JiBX/WS. Αυτό το μοντέλο είναι μόνο έξοδος και περιλαμβάνει έναν σχετικά μικρό αριθμό κλάσεων που, σε ορισμένες περιπτώσεις, συγκεντρώνουν δεδομένα από ένθετα στοιχεία μιας δομής WSDL XML ( σε συνδυασμό με ένα παιδικό στοιχείο , , Και μέσα σε συνδυασμό με το στοιχείο ή και τα λοιπά.). Αυτή η συμπαγής δομή κλάσης διευκόλυνε τη δημιουργία του υποσυνόλου των εγγράφων WSDL που υποστηρίζονται από το πλαίσιο, αλλά όταν άρχισα να σκέφτομαι τη δημιουργία ενός εργαλείου επαλήθευσης και αναδιάρθρωσης με βάση αυτό το μοντέλο, συνειδητοποίησα ότι το μοντέλο για την υποστήριξη εισόδου πιθανώς κακώς δομημένου WSDL θα πρέπει να είναι πιο κοντά στην παρουσίαση XML.

Μια άλλη επιλογή είναι η δημιουργία κώδικα από το σχήμα WS-I BP για το WSDL 1.1. Αφού το είδα αυτό, συνειδητοποίησα ότι η απευθείας χρήση των κλάσεων που δημιουργούνται θα οδηγούσε σε σύγχυση, καθώς ο σχεδιασμός περιλαμβάνει πλεονάζοντες τύπους, καθώς και μερικές άβολες κατασκευές που χρησιμοποιούνται για την αναπαράσταση διαφορετικών μοντέλων μηνυμάτων (μερικά από τα οποία στη συνέχεια απαγορεύτηκαν από το WS- I BP κείμενο) .

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

Η λίστα 3 δείχνει το τμήμα της κλάσης Definitions που αντιστοιχεί στο ριζικό στοιχείο .

Καταχώριση 3. Κατηγορία ορισμών (μερική)
Η δημόσια κλάση Ορισμοί επεκτείνει το ElementBase ( /** Λίστα θυγατρικών στοιχείων με την αναμενόμενη σειρά. */ static enum AddState ( μη έγκυρο, εισαγωγές, τύποι, μήνυμα, portType, binding, service ); /** Λίστα επιτρεπόμενων ονομάτων χαρακτηριστικών. */ public static final StringArray s_allowedAttributes = new StringArray(new String ( "name", "targetNamespace" ) /** Επικύρωση του περιβάλλοντος προς χρήση */ private ValidationContext. m_validationContext; /** Τρέχουσα κατάσταση (χρησιμοποιείται για τον έλεγχο της σειράς με την οποία προστίθενται */ /** παιδιά). */ ιδιωτικό AddState m_state; /** Το όνομα αυτού του ορισμού. */ ιδιωτική συμβολοσειρά m_name; /** Στόχευση χώρου ονομάτων WSDL. */ ιδιωτική συμβολοσειρά m_targetNamespace; /** Λίστα όλων των εισαγόμενων θυγατρικών στοιχείων. */ ιδιωτική λίστα m_imports = νέα ArrayList () /** Λίστα όλων των τύπων θυγατρικών στοιχείων. */ ιδιωτική λίστα m_types = νέα ArrayList () /** Λίστα όλων των μηνυμάτων θυγατρικών στοιχείων. */ ιδιωτική λίστα m_messages = νέα ArrayList () /** Λίστα όλων των θυγατρικών στοιχείων του portType. */ ιδιωτική λίστα M_portTypes = νέα ArrayList () /** Λίστα όλων των συνδέσεων θυγατρικών στοιχείων. */ ιδιωτική λίστα m_bindings = νέα ArrayList () /** Λίστα όλων των υπηρεσιών για παιδιά. */ ιδιωτική λίστα m_services = νέα ArrayList m_nameMessageMap = νέο HashMap () /** Αντιστοιχίζει το αναγνωρισμένο όνομα στον τύπο θύρας σε αυτόν τον ορισμό. */ ιδιωτικός χάρτης m_namePortTypeMap = νέο HashMap () /** Αντιστοιχίστε το αναγνωρισμένο όνομα στο μήνυμα σε αυτόν τον ορισμό. */ ιδιωτικός χάρτης m_nameBindingMap = νέο HashMap () /** Αντιστοιχίστε το αναγνωρισμένο όνομα στην υπηρεσία σε αυτόν τον ορισμό. */ ιδιωτικός χάρτης m_nameServiceMap = νέο HashMap () ... /** * Ελέγξτε για καταστάσεις μετάβασης μεταξύ διαφορετικών τύπων θυγατρικών στοιχείων. * Εάν τα στοιχεία δεν είναι στην αναμενόμενη σειρά, * το πρώτο στοιχείο από την αναμενόμενη σειρά επισημαίνεται για την αναφορά. * @param κατάσταση νέα προσθήκη κατάσταση * @param comp συστατικό στοιχείο */ private void checkAdd(AddState state, ElementBase comp) ( if (m_state != state) ( if (m_state == null || (m_state != AddState.invalid && state.ordinal() > m_state.ordinal())) ( // μετακίνηση σε άλλο τύπο θυγατρικών στοιχείων m_state = κατάσταση; ) αλλιώς εάν (state.ordinal()< m_state.ordinal()) { // отчет о дочерних элементах вне ожидаемого порядка m_validationContext.addWarning ("Child element of wsdl:definitions out of order", comp); m_state = AddState.invalid; } } } ... /** * Добавление немаршаллизированного дочернего элемента wsdl:message. * Здесь же сообщение индексируется по имени для доступа с целью валидации. * * @param child */ public void addMessage(Message child) { checkAdd(AddState.message, child); m_messages.add(child); addName(child.getName(), child, m_nameMessageMap); } ...

Η οργάνωση των δεδομένων θυγατρικών στοιχείων δείχνει πώς το μοντέλο υποστηρίζει και τα δύο γενικό σχήμαέντυπο εισόδου και εξόδου σύμφωνα με πρακτικές συστάσεις. Αντί για μια ενιαία λίστα παιδιών όλων των τύπων, χρησιμοποιούνται ξεχωριστές λίστες για κάθε τύπο. Η σύνδεση εισόδου JiBX αντιμετωπίζει τα θυγατρικά στοιχεία ως ένα μη ταξινομημένο σύνολο, καλώντας συγκεκριμένα αυτού του τύπουΜέθοδος ρύθμισης στοιχείων κάθε φορά που ένα θυγατρικό στοιχείο δεν είναι στη θέση του. Αντί να αντικαταστήσει οποιαδήποτε από τις προηγούμενες τιμές, ο ρυθμιστής προσθέτει την παρουσία στη λίστα πληκτρολογήσεων, όπως φαίνεται στον ρυθμιστή addMessage() που χρησιμοποιείται σε θυγατρικά στοιχεία . Κάθε ρυθμιστής εκτελεί επίσης έναν έλεγχο κατάστασης για να πιάσει στοιχεία εκτός σειράς.

Επιτρέπονται πρόσθετα χαρακτηριστικά και στοιχεία σε οποιοδήποτε στοιχείο WSDL (συνήθως όλα τα χαρακτηριστικά ή στοιχεία που δεν χρησιμοποιούν τον χώρο ονομάτων WSDL 1.1). Παραδείγματα τέτοιων πρόσθετων στοιχείων είναι οι διαμορφώσεις WS-Policy που είναι ενσωματωμένες στα έγγραφα WSDL από προηγούμενα άρθρα αυτής της σειράς, καθώς και σύνδεσμοι προς πραγματικές πολιτικές. Είναι καλύτερο αυτά τα πρόσθετα στοιχεία να προηγούνται οποιωνδήποτε θυγατρικών στοιχείων από τον χώρο ονομάτων WSDL 1.1, και αυτός είναι ο τρόπος χειρισμού τους στη δέσμευση εξόδου. Η δέσμευση εισόδου χειρίζεται πρόσθετα στοιχεία και χαρακτηριστικά χρησιμοποιώντας κωδικό κλάσης βάσης από τις κατηγορίες στοιχείων WSDL που δεν εμφανίζονται στο , και επιτρέπει στα στοιχεία να ακολουθούν με οποιαδήποτε σειρά (δημιουργώντας μια προειδοποίηση εάν ακολουθούν ένα στοιχείο από τον χώρο ονομάτων WSDL 1.1).

Το μοντέλο επεξεργάζεται γνωστά στοιχεία χρησιμοποιώντας ξεχωριστές δεσμεύσεις για το καθένα επιπλέον χώροονόματα, το καθένα με το δικό του σύνολο κλάσεων. Θα εξετάσω τον χειρισμό αυτών των πρόσθετων στοιχείων με περισσότερες λεπτομέρειες στο επόμενο τεύχος Υπηρεσίες Ιστού Java, όπου ο πηγαίος κώδικας θα παρουσιαστεί με περισσότερες λεπτομέρειες.

Επαλήθευση μοντέλου

Κάποια βασική επαλήθευση των δεδομένων WSDL εκτελείται καθώς προστίθενται μη μαρκαρισμένα αντικείμενα που αντιστοιχούν στα στοιχεία δομή δέντρουέγγραφο WSDL, όπως φαίνεται στον κώδικα addMessage() στο τέλος του . Αυτός ο κώδικας χρησιμοποιεί τη μέθοδο checkAdd() για να ελέγξει τη σειρά των θυγατρικών στοιχείων και τη μέθοδο addName() για να ελέγξει ότι παρουσιάζεται ένα έγκυρο όνομα (το κείμενο ταιριάζει με τον τύπο σχήματος NCName και η τιμή είναι μοναδική στον τύπο στοιχείου) και αντιστοιχίζει το όνομα στο αντικείμενο. Αλλά αυτό είναι μόνο έλεγχος των πιο βασικών πληροφοριών για ένα μεμονωμένο στοιχείο. είναι απαραίτητο να ελεγχθούν άλλες ιδιότητες κάθε στοιχείου και οι σχέσεις μεταξύ των στοιχείων πρόσθετος κωδικόςεπαλήθευση.

Το JiBX σάς επιτρέπει να καλείτε προσαρμοσμένους χειριστές επεκτάσεων ως μέρος της διαδικασίας ομαδοποίησης και κατάργησης. Για να εκτελέσει τη λογική επαλήθευσης, το μοντέλο WSDL χρησιμοποιεί έναν από αυτούς τους πρόσθετους χειριστές, τη μέθοδο μετά το σύνολο. Η μέθοδος μετά το σύνολο καλείται αφού ολοκληρωθεί η κατάργηση του συσχετισμένου αντικειμένου, επομένως αυτός είναι συχνά ένας καλός τρόπος για την εκτέλεση ελέγχων τύπου επαλήθευσης αντικειμένου. Στην περίπτωση της επαλήθευσης WSDL, η απλούστερη προσέγγιση είναι να εκτελεστεί όλη η επαλήθευση αντικειμένων από μια ενιαία μέθοδο μετά το σύνολο στο ριζικό στοιχείο . Αυτή η προσέγγιση αποφεύγει το πρόβλημα της άμεσης αναφοράς σε στοιχεία του εγγράφου WSDL όταν τα στοιχεία δεν εμφανίζονται με την αναμενόμενη σειρά.

Άλλα πρόσθετα

Αυτό το άρθρο παρέχει τις βασικές αρχές της δομής και της χρήσης του WSDL και μια εισαγωγή στο μοντέλο δεδομένων Java για το WSDL, το οποίο έχει σχεδιαστεί για να υποστηρίζει την επαλήθευση των εγγράφων WSDL και τη μετατροπή τους σε μια φόρμα βέλτιστης πρακτικής.

Το επόμενο άρθρο θα συνεχίσει αυτό το θέμα εξετάζοντας ζητήματα που αντιμετωπίζονται συνήθως κατά τη σύνταξη ισχυρισμών WS-Policy και WS-SecurityPolicy. Θα εξετάσει επίσης το μοντέλο WSDL και τη διαδικασία επαλήθευσης, συμπεριλαμβανομένης της επέκτασης του μοντέλου ώστε να περιλαμβάνει ισχυρισμούς WS-Policy/WS-SecurityPolicy που είναι ενσωματωμένοι στο WSDL.

WSDL (Γλώσσα περιγραφής υπηρεσιών Ιστού) η έκδοση 1.1 δημοσιεύτηκε στις 15 Μαρτίου 2001. WSDLείναι μια μορφή βασισμένη σε XML που χρησιμοποιείται για την περιγραφή υπηρεσιών Ιστού χρησιμοποιώντας μηνύματα που περιέχουν πληροφορίες σχετικά με τον τρόπο πρόσβασης σε μια συγκεκριμένη υπηρεσία Ιστού. WSDLεπεκτάσιμο, το οποίο σας επιτρέπει να περιγράφετε τις υπηρεσίες και τα μηνύματά τους ανεξάρτητα από τις μορφές μηνυμάτων ή τα πρωτόκολλα δικτύου που χρησιμοποιούνται για τη μεταφορά, ωστόσο, το WSDL 1.1 χρησιμοποιείται συχνότερα μαζί με το SOAP 1.1, το HTTP GET/POST και το MIME. Επειδή η WSDLαναπτύχθηκε από κοινού με το SOAP και στην ανάπτυξή του συμμετείχαν οι ίδιες εταιρείες Microsoft, Ariba και IBM. Αν αναλογιστούμε το έγγραφο WSDLδιαισθητικά, μπορούμε να πούμε ότι επιτρέπει απαντήστε σε 4 ερωτήσεις:

1) τι κάνεις? Η απάντηση σε αυτό το ερώτημα δίνεται με μια μορφή κατάλληλη τόσο για την ανθρώπινη αντίληψη όσο και για την αντιληπτή από τη μηχανή μορφή. Απάντηση για το άτομο στις ετικέτες:<όνομα/>, <τεκμηρίωση/>, για αυτοκίνητο -<μήνυμα/>, <Τύπος σημείου>

2) Τι γλώσσα μιλάτε? (ποιους τύπους χρησιμοποιείτε;) Απαντήστε στην ετικέτα:<τύπους/>

3) πώς θα επικοινωνήσω μαζί σας; (πώς θα έχει πρόσβαση ο πελάτης στην υπηρεσία web;): HTTP ή SMTP. Η απάντηση βρίσκεται στο<δεσμευτικός/>

4) Που μπορώ να σε βρω; (πού μπορώ να βρω αυτήν την υπηρεσία web ή ποια είναι η διεύθυνση URL της;). Η απάντηση είναι:<υπηρεσία/>

Δομή:

Κάθε έγγραφο WSDL μπορεί να αναλυθεί σε τρία λογικά μέρη:

1. καθορισμός τύπων δεδομένων - τον προσδιορισμό του τύπου των μηνυμάτων που αποστέλλονται και λαμβάνονται από την υπηρεσία XML

2. αφηρημένες πράξεις - λίστα λειτουργιών που μπορούν να εκτελεστούν με μηνύματα

3. σύνδεση υπηρεσιών - η μέθοδος με την οποία θα παραδοθεί το μήνυμα

Τεκμηρίωση WSDLμπορεί να δημιουργηθεί χειροκίνητα, αλλά η γλώσσα είναι αυστηρά επισημοποιημένη WSDLσας επιτρέπει να αυτοματοποιήσετε τη διαδικασία γραφής WSDL-έγγραφα. Πολλά εργαλεία σύνταξης υπηρεσιών Web περιέχουν βοηθητικά προγράμματα που δημιουργούν αυτόματα WSDL-αρχεία που περιγράφουν έτοιμες υπηρεσίες Web. Για παράδειγμα, το Εργαλείο συγγραφής υπηρεσιών Web Άξονας Απάτσιπεριέχει μια τάξη Java2WSDL, δημιουργία WSDL- ένα αρχείο μιας κλάσης ή διεπαφής Java που περιγράφει μια υπηρεσία Ιστού. Το πακέτο IBM WSTK, το οποίο περιλαμβάνει Αξονας, περιέχει το βοηθητικό πρόγραμμα java2wsdl, το οποίο δημιουργεί και εκτελεί ένα αντικείμενο από αυτήν την κλάση. Λειτουργεί από τη γραμμή εντολών.

Στοιχεία εγγράφου WSDL

Ας περιγράψουμε τις πιο συχνά χρησιμοποιούμενες ετικέτες WSDL:

Ετικέτα είναι η ρίζα όλων των εγγράφων WSDL. Ορίζει πολλούς χώρους ονομάτων:

1)στόχος Ο χώρος ονομάτων είναι ο χώρος ονομάτων της υπηρεσίας ιστού μας

2) xmlns – τυπικός χώρος ονομάτων εγγράφων WSDL

3)xmlns: SOAP_ENC – χώρος ονομάτων που χρησιμοποιείται για την περιγραφή της κωδικοποίησης SOAP


4) xmlns: impl και intf – ο χώρος ονομάτων της υλοποίησης και του ορισμού της διαδικτυακής μας υπηρεσίας

· Έγγραφο ορισμού υπηρεσίας Web

· Έγγραφο για την υλοποίηση μιας διαδικτυακής υπηρεσίας

Για απλότητα, κατά κανόνα, χρησιμοποιούν 1 αρχείο που περιέχει όλες τις πληροφορίες

Στοιχείο - παρέχει πληροφορίες σχετικά με τα δεδομένα που μεταφέρονται από το ένα τελικό σημείο στο άλλο.

Για να περιγράψετε μια κλήση RPC, πρέπει να δημιουργήσετε ένα μήνυμα εισόδου και ένα μήνυμα εξόδου.

Σε αυτό το στοιχείο, μπορείτε να καθορίσετε παραμέτρους μεθόδου χρησιμοποιώντας το στοιχείο

Στοιχείο περιγράφει και ορίζει τις λειτουργίες ή τις μεθόδους που υποστηρίζονται από μια υπηρεσία web

Οι λειτουργίες μπορούν να έχουν μηνύματα εισαγωγής καθώς και μηνύματα σφάλματος.

Στοιχείο - περιγράφει πώς οι λειτουργίες που καθορίζονται σε έναν τύπο θύρας θα μεταδοθούν μέσω του δικτύου. Επειδή Το στοιχείο χρησιμοποιεί έναν τύπο θύρας, πρέπει να καθορίσει έναν τύπο που ορίστηκε κάπου νωρίτερα στο έγγραφο.

Στοιχείο - υποδεικνύει πού θα βρείτε την υπηρεσία web

Στοιχείο εισαγωγή . Πολύ συχνά το στοιχείο υπηρεσίας εκχωρείται σε αυτό έγγραφο wsdlγια λόγους πρακτικότητας.

Για να επιτραπεί ο συνδυασμός πολλών εγγράφων wsdl σε ένα, χρησιμοποιείται το στοιχείο εισαγωγής. Σας επιτρέπει να συμπεριλάβετε ένα έγγραφο wsdl σε ένα άλλο.

Στοιχείο τύπους σας επιτρέπει να καθορίσετε τους τύπους δεδομένων που μεταδίδονται εάν δεν είναι τυπικοί.

Το WSDL υποστηρίζει 4 τρόπους λειτουργίας:

· μονόδρομες ή μονόδρομες λειτουργίες. Το μήνυμα αποστέλλεται στο τελικό σημείο της υπηρεσίας. Σε αυτήν την περίπτωση, η λειτουργία περιγράφεται από ένα μόνο μήνυμα εισόδου.

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

· Λειτουργία τύπου αίτησης-απόκρισης. Σε αυτήν τη λειτουργία, ένα τελικό σημείο είναι πελάτης ενός άλλου τερματικού σημείου. Η μορφή λειτουργίας είναι παρόμοια με τη λειτουργία αίτησης-απόκρισης, αλλά τα δεδομένα εξόδου παρατίθενται πριν από τα δεδομένα εισόδου.

· Ειδοποίηση λειτουργίας. Αυτή η λειτουργία είναι μια άλλη έκδοση του πρωτόγονου μονόδρομου μετάδοσης, στην οποία το τελικό σημείο στέλνει το μήνυμα αντί να το λαμβάνει. Η λειτουργία περιέχει μόνο ένα μήνυμα εξόδου.