Περιγραφή των Υπηρεσιών Ιστού σε γλώσσα WSDL. Γλώσσα WSDL. Δομή ενός εγγράφου WSDL. Μέθοδοι δημιουργίας. Τρόποι λειτουργίας WSDL
Ο τίτλος του θέματος είναι πραγματικά μια ερώτηση, γιατί... Ο ίδιος δεν ξέρω τι είναι και για πρώτη φορά θα προσπαθήσω να το δουλέψω στο πλαίσιο αυτού του άρθρου. Το μόνο πράγμα που μπορώ να εγγυηθώ είναι ότι ο κώδικας που παρουσιάζεται παρακάτω θα λειτουργήσει, αλλά οι φράσεις μου θα είναι μόνο υποθέσεις και εικασίες για το πώς εγώ ο ίδιος καταλαβαίνω όλα αυτά. Λοιπόν πάμε...
Εισαγωγή
Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως RPC (Remote Procedure Calling). Παραδείγματα περιλαμβάνουν τεχνολογίες CORBA και για Java - RMI (Remote Method Invoking). Και όλα δείχνουν να είναι καλά σε αυτούς, ειδικά στην CORBA, γιατί... Μπορείτε να εργαστείτε με αυτό σε οποιαδήποτε γλώσσα προγραμματισμού, αλλά κάτι έλειπε ακόμα. Πιστεύω ότι το μειονέκτημα της CORBA είναι ότι λειτουργεί μέσω ορισμένων από τα δικά της πρωτόκολλα δικτύου αντί για απλό HTTP, το οποίο θα χωράει σε οποιοδήποτε τείχος προστασίας. Η ιδέα της διαδικτυακής υπηρεσίας ήταν να δημιουργήσει ένα RPC που θα εισαγόταν σε πακέτα HTTP. Έτσι ξεκίνησε η ανάπτυξη του προτύπου. Ποιες είναι οι βασικές έννοιες αυτού του προτύπου:- ΣΑΠΟΥΝΙ. Πριν καλέσετε μια απομακρυσμένη διαδικασία, πρέπει να περιγράψετε αυτήν την κλήση αρχείο XML e Μορφή SOAP. Το SOAP είναι απλώς μια από τις πολλές σημάνσεις XML που χρησιμοποιούνται σε υπηρεσίες web. Όλα όσα θέλουμε να στείλουμε κάπου μέσω HTTP μετατρέπονται πρώτα σε XML Περιγραφή SOAP, στη συνέχεια τοποθετείται σε ένα πακέτο HTTP και αποστέλλεται σε άλλον υπολογιστή στο δίκτυο μέσω TCP/IP.
- WSDL. Υπάρχει μια διαδικτυακή υπηρεσία, π.χ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία web και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο XML, το οποίο έχει διαφορετική μορφή, δηλαδή το WSDL. Εκείνοι. Το WSDL είναι απλώς ένα αρχείο XML που περιγράφει μια υπηρεσία Ιστού και τίποτα περισσότερο.
Γενική προσέγγιση
Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η διαδικτυακή μας υπηρεσία και μερικές φορές ονομάζεται τελικό σημείο (όπως, τελικό σημείο, όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:- Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
- Εφαρμογή αυτής της διεπαφής
- Εκκινήστε την υπηρεσία web μας
- Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως επιθυμητή μέθοδουπηρεσία Ιστού
Υπηρέτης
Ας ξεκινήσουμε το 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 (χώρος ονομάτων στόχου).
Στο ριζικό στοιχείο
?
?
?
?
?
? < service >- καθορίζει τη θέση της υπηρεσίας Web ως μία ή περισσότερες θύρες. Κάθε θύρα περιγράφεται από ένα ένθετο στοιχείο
Εκτός από αυτά τα έξι βασικά στοιχεία, υπάρχουν δύο ακόμη βοηθητικά στοιχεία.
?
Ενα σχόλιο. Μπορεί να συμπεριληφθεί σε οποιοδήποτε στοιχείο
Περιγραφές WSDL.
Μπορούμε να πούμε ότι τα στοιχεία
Στοιχεία
Τέλος, τα στοιχεία
Η δομή ενός εγγράφου 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" /> "http://localhost:8080/axis/EchoService.jws" /> Στην Λίστα 4.2 είμαστε στο στοιχείο Τα ονόματα "getEchoRequest" ΚΑΙ "getEchoResponse" ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΣΤΟ ΕΠΟΜΕΝΟ ΣΤΟΙΧΕΙΟ txarspcrt^=^"ht:tp^://?chepas^.>plscap^.c^rc^/?cap^/ht:tp^" /> Εάν χρησιμοποιείται το στυλ εγγράφου SOAP, το χαρακτηριστικό στυλ ορίζεται σε "document". Τέλος, στο στοιχείο Στη Λίστα 4.2, τα ονόματα με πρόθεμα σαπούνι καθόρισαν την περιγραφή του μηνύματος και τον τρόπο αποστολής του. Ας δούμε ποια συγκεκριμένα πρωτόκολλα προσφέρει η προδιαγραφή WSDL 1.2. Βιβλιογραφία: Khabibullin I. Sh. Ανάπτυξη υπηρεσιών Ιστού με χρήση Java. - Αγία Πετρούπολη: BHV-Petersburg, 2003. - 400 σελ.: ill. Μόλις μου έθεσαν το καθήκον να ξεκινήσω την ανάπτυξη των υπηρεσιών Ιστού και μου έδωσαν τις πηγές ενός απλού έργου χωρίς καμία εξήγηση. Το έργο, φυσικά, δεν ξεκίνησε. Επίσης δεν είχα ιδέα τι ήταν η Άνοιξη και πώς λειτουργούσε. Επίσης, δεν μπόρεσα να βρω επαρκή άρθρα σχετικά με την ανάπτυξη υπηρεσιών Ιστού χρησιμοποιώντας το Spring, είτε στα ρωσικά είτε στα αγγλικά. Έπρεπε να το καταλάβω μόνος μου, αλλά αποδείχθηκε ότι δεν ήταν τόσο τρομακτικό. Αυτό το άρθρο είναι ένας οδηγός για την ανάπτυξη μιας απλής υπηρεσίας Web χρησιμοποιώντας το πρωτόκολλο SOAP χρησιμοποιώντας Spring-WS. Στη συνέχεια, εκτελέστε το Ant-build (ελπίζω να το έχετε ήδη εγκαταστήσει). Δημιουργήστε το αρχείο HelloServiceEndpoint.java: Τώρα ας πάμε λίγο πίσω και ας θυμηθούμε τον σχολιασμό @Υπηρεσία. Χωρίς να μπαίνουμε σε λεπτομέρειες για να μην υπερφορτώνουμε τον αναγνώστη με περιττές πληροφορίες, αυτός ο σχολιασμός λέει στην Spring να δημιουργήσει το κατάλληλο αντικείμενο και τον σχολιασμό @Autowiredχρησιμεύει για έγχυση (αυτόματη αντικατάσταση) του αντίστοιχου αντικειμένου. Φυσικά, κατά τη δημιουργία απλών εφαρμογών, δεν έχει νόημα να χρησιμοποιείτε αυτούς τους σχολιασμούς, αλλά αποφάσισα να μην τους εξαιρέσω σε αυτό το παράδειγμα. Τα υπόλοιπα, πάλι, όλα πρέπει να είναι ξεκάθαρα. Σημειώστε ότι ServiceRequest, ServiceResponse κ.λπ. – αυτές είναι ακριβώς οι κλάσεις που δημιουργήθηκαν με βάση το σχήμα xml μας. Οι δύο επόμενοι κάδοι θα παραμένουν πάντα αμετάβλητοι. Η ουσία τους είναι να λαμβάνουν και να μετατρέπουν ένα αίτημα από το Xml σε αντικείμενο Java και περαιτέρω αντίστροφη μετατροπή. sws:dynamic-wsdlείναι υπεύθυνος για την αυτόματη δημιουργία ενός εγγράφου WSDL που βασίζεται στο δημιουργημένο σχήμα XML. Για περαιτέρω δοκιμές χρειαζόμαστε soapUI (έχω την έκδοση 3.0.1). Πώς ορίζει το 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 και τη μετατροπή τους σε τυπική μορφή. Αυτό το άρθρο χρησιμοποιεί: Η αναθεώρηση 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 χρησιμοποιούν ένα σταθερό, εύχρηστο ριζικό στοιχείο Υπάρχει και ένα στοιχείο Για πλήρη περιγραφή της υπηρεσίας, κατά κανόνα, απαιτείται τουλάχιστον, ένα στοιχείο καθενός από αυτούς τους τύπους, εκτός Η λίστα 1 δείχνει ένα παράδειγμα περιγραφής υπηρεσίας WSDL που χωρίζεται σε δύο έγγραφα WSDL, έτσι ώστε τα στοιχεία περιγραφής της διεπαφής να περιέχονται στο αρχείο BookServerInterface.wsdl και τα στοιχεία υλοποίησης στο αρχείο BookServerImpl.wsdl. Η λίστα 1 εμφανίζει το 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.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 είναι πιθανώς καλύτερη επιλογή. Στοιχεία Παιδικά στοιχεία Οι επεκτάσεις που ορίζονται από το WSDL μπαίνουν στο παιχνίδι Μέσα σε κάθε παιδικό στοιχείο Το τελευταίο στοιχείο της περιγραφής της υπηρεσίας WSDL είναι το στοιχείο Δεν προκαλεί έκπληξη το γεγονός ότι με όλες τις παραλλαγές στα σχήματα και τους κανόνες για έγγραφα WSDL 1.1, πολλά έγγραφα δεν συμμορφώνονται με τις βέλτιστες πρακτικές της BP WS-I. Η υποστήριξη πολλών αποκλίσεων από τις βέλτιστες πρακτικές σε όλες τις στοίβες υπηρεσιών Ιστού συνέβαλε στη διαιώνιση της χρήσης απαρχαιωμένων ή εσφαλμένων σχεδίων, οδηγώντας στη διάδοση κακών πρακτικών σε ολόκληρο τον κλάδο. Και σίγουρα δεν έχω ανοσία σε αυτή τη μόλυνση - ενώ κοιτάζω τα έγγραφα WSDL που παρείχα ως παραδείγματα κώδικα για αυτήν τη σειρά, με έκπληξη διαπίστωσα ότι κανένα από αυτά δεν ήταν απολύτως σωστό. Έτσι, όταν αποφάσισα να γράψω αυτό το άρθρο, σκέφτηκα ότι θα ήταν ωραίο να συμπεριλάβω ένα εργαλείο που σας επιτρέπει να ελέγχετε τα έγγραφα WSDL σε σχέση με τις βέλτιστες πρακτικές. Φαίνεται ότι αυτό απέχει μόλις ένα βήμα από τη μετατροπή εγγράφων WSDL στη σωστή μορφή, υπό την προϋπόθεση ότι το αρχικό WSDL δεν περιέχει σφάλματα. Αλλά υπήρχε πολύ περισσότερη δουλειά από αυτή που είχα αρχικά σχεδιάσει, και πλήρεις πληροφορίεςΘα συμπεριλάβω πληροφορίες για αυτό το μοντέλο στα επόμενα δύο άρθρα αυτής της σειράς. Για να εργαστείτε με έγγραφα WSDL στη γλώσσα Java, πολλά διάφορα μοντέλα, συμπεριλαμβανομένης μιας ευρέως χρησιμοποιούμενης γλώσσας περιγραφής υπηρεσιών Ιστού για Java Toolkit(WSDL4J), το οποίο είναι μια υλοποίηση αναφοράς του JSR 110 (βλ. ενότητα ). Κανένα από αυτά τα μοντέλα δεν ταιριάζει με αυτό που είχα σκοπό να κάνω, λόγω της διπλής φύσης του προβλήματος: πρώτον, ανάγνωση εγγράφων WSDL σε οποιαδήποτε ημι-έξυπνη μορφή και αναφορά σφαλμάτων και αποκλίσεων από τις βέλτιστες πρακτικές, και δεύτερον, σύνταξη WSDL χωρίς σφάλματα. εγγράφων που έχουν αναμορφοποιηθεί σε μορφή συμβατή με πρακτικές συστάσεις. Το WSDL4J, για παράδειγμα, δεν διατηρεί τη σειρά των στοιχείων εισόδου, έτσι ώστε να μπορούν να αναφέρονται προβλήματα παραγγελίας και δεν χειρίζεται ορισμούς σχημάτων, ώστε να μην μπορεί να χρησιμοποιηθεί απευθείας για τον έλεγχο αναφορών από στοιχεία Σε αυτό το άρθρο χρησιμοποιώ τον όρο επαλήθευσηνα αναφέρεται στον έλεγχο της εγκυρότητας ενός εγγράφου WSDL, επειδή ο εναλλακτικός όρος επικύρωση, που χρησιμοποιείται συνήθως για έγγραφα XML, σημαίνει έλεγχος εγγράφων σε σχέση με έναν ορισμό σχήματος. Στο παρελθόν έχω εφαρμόσει εν μέρει ένα μοντέλο WSDL για χρήση με σύνδεση δεδομένων JiBX ως μέρος του έργου JiBX/WS. Αυτό το μοντέλο είναι μόνο έξοδος και περιλαμβάνει έναν σχετικά μικρό αριθμό κλάσεων που, σε ορισμένες περιπτώσεις, συγκεντρώνουν δεδομένα από ένθετα στοιχεία μιας δομής WSDL XML ( Μια άλλη επιλογή είναι η δημιουργία κώδικα από το σχήμα WS-I BP για το WSDL 1.1. Αφού το είδα αυτό, συνειδητοποίησα ότι η απευθείας χρήση των κλάσεων που δημιουργούνται θα οδηγούσε σε σύγχυση, καθώς ο σχεδιασμός περιλαμβάνει πλεονάζοντες τύπους, καθώς και μερικές άβολες κατασκευές που χρησιμοποιούνται για την αναπαράσταση διαφορετικών μοντέλων μηνυμάτων (μερικά από τα οποία στη συνέχεια απαγορεύτηκαν από το WS- I BP κείμενο) . Έτσι κατέληξα να μεταγλωττίζω τις τάξεις με το χέρι, αν και το αποτέλεσμα ήταν σχεδόν το ίδιο σαν να είχα ξεκινήσει με κώδικα που δημιουργήθηκε από το σχήμα και απλώς μείωσε την περιττή αντιγραφή και την πολυπλοκότητα. Η σύνδεση δεδομένων JiBX υποστηρίζει πολλαπλές δεσμεύσεις στις ίδιες κλάσεις, επομένως μπόρεσα να δημιουργήσω μια σύνδεση εισόδου για να χειριστώ το πλήρες εύρος των παραλλαγών που επιτρέπονται από οποιαδήποτε έκδοση του WSDL 1.1, αν και ο ορισμός της δέσμευσης εξόδου για την έξοδο WSDL ήταν μόνο στη μορφή βέλτιστης πρακτικής. Η λίστα 3 δείχνει το τμήμα της κλάσης Definitions που αντιστοιχεί στο ριζικό στοιχείο Η οργάνωση των δεδομένων θυγατρικών στοιχείων δείχνει πώς το μοντέλο υποστηρίζει και τα δύο γενικό σχήμαέντυπο εισόδου και εξόδου σύμφωνα με πρακτικές συστάσεις. Αντί για μια ενιαία λίστα παιδιών όλων των τύπων, χρησιμοποιούνται ξεχωριστές λίστες για κάθε τύπο. Η σύνδεση εισόδου 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 και μια εισαγωγή στο μοντέλο δεδομένων 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: Ετικέτα 1)στόχος Ο χώρος ονομάτων είναι ο χώρος ονομάτων της υπηρεσίας ιστού μας 2) xmlns – τυπικός χώρος ονομάτων εγγράφων WSDL 3)xmlns: SOAP_ENC – χώρος ονομάτων που χρησιμοποιείται για την περιγραφή της κωδικοποίησης SOAP 4) xmlns: impl και intf – ο χώρος ονομάτων της υλοποίησης και του ορισμού της διαδικτυακής μας υπηρεσίας · Έγγραφο ορισμού υπηρεσίας Web · Έγγραφο για την υλοποίηση μιας διαδικτυακής υπηρεσίας Για απλότητα, κατά κανόνα, χρησιμοποιούν 1 αρχείο που περιέχει όλες τις πληροφορίες Στοιχείο Για να περιγράψετε μια κλήση RPC, πρέπει να δημιουργήσετε ένα μήνυμα εισόδου και ένα μήνυμα εξόδου. Σε αυτό το στοιχείο, μπορείτε να καθορίσετε παραμέτρους μεθόδου χρησιμοποιώντας το στοιχείο Στοιχείο Οι λειτουργίες μπορούν να έχουν μηνύματα εισαγωγής καθώς και μηνύματα σφάλματος. Στοιχείο Στοιχείο Στοιχείο εισαγωγή
. Πολύ συχνά το στοιχείο υπηρεσίας εκχωρείται σε αυτό έγγραφο wsdlγια λόγους πρακτικότητας. Για να επιτραπεί ο συνδυασμός πολλών εγγράφων wsdl σε ένα, χρησιμοποιείται το στοιχείο εισαγωγής. Σας επιτρέπει να συμπεριλάβετε ένα έγγραφο wsdl σε ένα άλλο. Στοιχείο τύπους
σας επιτρέπει να καθορίσετε τους τύπους δεδομένων που μεταδίδονται εάν δεν είναι τυπικοί. Το WSDL υποστηρίζει 4 τρόπους λειτουργίας: · μονόδρομες ή μονόδρομες λειτουργίες. Το μήνυμα αποστέλλεται στο τελικό σημείο της υπηρεσίας. Σε αυτήν την περίπτωση, η λειτουργία περιγράφεται από ένα μόνο μήνυμα εισόδου. · Αίτημα-Απάντηση – λειτουργία αίτησης-απόκρισης. Αυτός ο τρόπος λειτουργίας είναι ο πιο συνηθισμένος. Σε αυτήν τη λειτουργία, η περιγραφή λειτουργίας περιέχει ένα μήνυμα εισόδου, ένα μήνυμα εξόδου και ένα προαιρετικό μήνυμα σφάλματος. · Λειτουργία τύπου αίτησης-απόκρισης. Σε αυτήν τη λειτουργία, ένα τελικό σημείο είναι πελάτης ενός άλλου τερματικού σημείου. Η μορφή λειτουργίας είναι παρόμοια με τη λειτουργία αίτησης-απόκρισης, αλλά τα δεδομένα εξόδου παρατίθενται πριν από τα δεδομένα εισόδου. · Ειδοποίηση λειτουργίας. Αυτή η λειτουργία είναι μια άλλη έκδοση του πρωτόγονου μονόδρομου μετάδοσης, στην οποία το τελικό σημείο στέλνει το μήνυμα αντί να το λαμβάνει. Η λειτουργία περιέχει μόνο ένα μήνυμα εξόδου.
Και πρόσφατα αποφάσισα να εξετάσω ποιες νέες δυνατότητες έχουν προστεθεί στο Spring από τότε και να ενημερώσω παλιές υπηρεσίες, κάτι που με ώθησε να γράψω αυτό το άρθρο.
Και έτσι, θα γράψουμε την απλούστερη υπηρεσία που δέχεται το όνομα χρήστη και στέλνει χαιρετισμό και την τρέχουσα ώρα στον διακομιστή.Τι χρειαζόμαστε?
Προετοιμασία για δουλειά
Ας δημιουργήσουμε ένα νέο έργο εφαρμογής 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.
Στο 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 – μια κλάση που θα είναι υπεύθυνη για την επεξεργασία των εισερχόμενων αιτημάτων (ένα είδος σημείου εισόδου).
πακέτο 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.Διαμόρφωση υπηρεσίας ελατηρίου
Το τέλος πλησιάζει τώρα.
Δημιουργήστε το αρχείο service-ws-servlet.xml.
sws:annotation-driven– αυτό σημαίνει απλώς ότι χρησιμοποιούνται σχολιασμοί σε αυτό το έργο.
ΕΝΑ context:component-scanυποδεικνύει το πακέτο στο οποίο θα αναζητηθούν οι σχολιασμοί και η αναζήτηση θα πραγματοποιηθεί επίσης σε υποπακέτα.
τοποθεσίαυποδεικνύει τη διαδρομή προς το σχήμα.
τοποθεσίαUri– τη διεύθυνση (σε σχέση με το κοντέινερ) όπου θα είναι διαθέσιμο το σχήμα WSDL.
Στην περίπτωσή μου το WSDL είναι διαθέσιμο στην ακόλουθη διεύθυνση:
localhost/HelloService/HelloService.wsdlΠεριγραφέας ανάπτυξης
Και τέλος, το τελευταίο.
Στον κατάλογο WEB-INF αλλάζουμε ή δημιουργούμε το αρχείο web.xml.
Δεν θα περιγράψω πια αυτό το αρχείο. Για απλά έργα, ουσιαστικά δεν πρέπει να αλλάξει. Αξίζει μόνο να σημειωθεί ότι το όνομα servlet (servlet-name) πρέπει να ταιριάζει με το όνομα του αρχείου διαμόρφωσης υπηρεσίας Spring service-ws-servlet.xml. Έλεγχος λειτουργικότητας
Το πρώτο κιόλας σημάδι σωστή λειτουργίαείναι το δημιουργημένο σχήμα WSDL.
Για να ελέγξετε, απλώς μεταβείτε στη διεύθυνση αυτού του σχήματος (http://localhost/HelloService/HelloService.wsdl) και δείτε: το αρχείο xml θα πρέπει να εμφανίζεται εκεί. Εάν δεν εμφανίζεται τίποτα ή εμφανίζεται κάποιο σφάλμα, διαβάστε ξανά προσεκτικά ολόκληρο το άρθρο και αναζητήστε τι κάναμε λάθος.
Εγκαταστήστε το και εκκινήστε το.
Δημιουργήστε ένα νέο έργο: Αρχείο => Νέο έργο soapUI. Στο πεδίο Initial WSDL/WADL, εισαγάγετε έναν σύνδεσμο προς το σχήμα WSDL (http://localhost/HelloService/HelloService.wsdl).
Στο έργο που δημιουργήθηκε, ανοίξτε το απαιτούμενο αίτημα.
Εισαγάγετε το όνομα στο πεδίο Όνομα και κάντε κλικ στο κουμπί «Αποστολή αιτήματος».
Ως αποτέλεσμα, λαμβάνουμε μια απάντηση από τον διακομιστή με έναν χαιρετισμό και την τρέχουσα ώρα.
Αν κάτι πάει στραβά, διαβάστε ξανά αυτό το άρθρο.Τι έπεται?
Λοιπόν, το επόμενο βήμα είναι να γράψετε έναν πελάτη για αυτήν την υπηρεσία Web. Αλλά αυτό είναι ήδη υλικό για ένα άλλο άρθρο, το οποίο μπορεί να γραφτεί αργότερα, εάν αυτό το υλικόκάποιος θα ενδιαφερθεί. Σειρά περιεχομένου:
Σχετικά με αυτήν τη σειρά άρθρων
Ανάλυση WSDL 1.1
Χρησιμοποιούνται χώροι ονομάτων
Περιγραφή Στοιχεία
Καταχώριση 1. BookServerInterface.wsdl
Καταχώριση 2. BookServerImpl.wsdl
Στοιχεία εξαρτήματος
Εικόνα 1. Σχέσεις μεταξύ των στοιχείων WSDL
Σύγκριση SOAP 1.1 και 1.2
Εργασία με WSDL
Μοντέλο WSDL
Επικύρωση και επαλήθευση
Καταχώριση 3. Κατηγορία ορισμών (μερική)
Η δημόσια κλάση Ορισμοί επεκτείνει το ElementBase ( /** Λίστα θυγατρικών στοιχείων με την αναμενόμενη σειρά. */ static enum AddState ( μη έγκυρο, εισαγωγές, τύποι, μήνυμα, portType, binding, service ); /** Λίστα επιτρεπόμενων ονομάτων χαρακτηριστικών. */ public static final StringArray s_allowedAttributes = new StringArray(new String ( "name", "targetNamespace" ) /** Επικύρωση του περιβάλλοντος προς χρήση */ private ValidationContext. Επαλήθευση μοντέλου
Άλλα πρόσθετα