Τι είναι μια διαδικτυακή υπηρεσία - Περιγραφή με χρήση WSDL. Ποια είναι η διαφορά μεταξύ XSD και WSDL

Τα στοιχεία επέκτασης δέσμευσης χρησιμοποιούνται για τον καθορισμό μιας συγκεκριμένης γραμματικής για εισερχόμενα (3) και εξερχόμενα (4) μηνύματα σφάλματος (5). Μπορούν επίσης να καθοριστούν πληροφορίες για το επίπεδο λειτουργίας (2) και το επίπεδο σύνδεσης (1).

Το στοιχείο σύνδεσης λειτουργίας περιέχει δεδομένα για τη λειτουργία με το ίδιο όνομα του συσχετισμένου τύπου θύρας. Ωστόσο, το όνομα της λειτουργίας γενικά δεν είναι μοναδικό (παράδειγμα: υπερφόρτωση μεθόδων / συναρτήσεων - χρήση των ίδιων ονομάτων με διαφορετικές υπογραφές), επομένως μπορεί να μην είναι αρκετός ο μοναδικός προσδιορισμός της λειτουργίας στόχου του τύπου θύρας. Σε τέτοιες περιπτώσεις, η λειτουργία προορισμού αντιμετωπίζεται καθορίζοντας επιπλέον τα κατάλληλα ονόματα στοιχείων wsdl:input και wsdl:output χρησιμοποιώντας το χαρακτηριστικό name.

Δεσμευτικός πρέπειεγκαταστήστε μόνο ένα πρωτόκολλο.

Δεσμευτικός δεν θα έπρεπεπεριέχει πληροφορίες διεύθυνσης.

Λιμάνι

Μια θύρα ορίζει ένα μόνο τελικό σημείο ορίζοντας μια διεύθυνση προς σύνδεση.

  1. <wsdl:ορισμούς .... >
  2. <wsdl:υπηρεσία .... > *
  3. <wsdl:λιμάνι name = "nmtoken" binding = "qname" > *
  4. <-- extensibility element (1) -->
  5. wsdl:λιμάνι>
  6. wsdl:υπηρεσία>
  7. wsdl:ορισμούς>

Το χαρακτηριστικό name καθορίζει μοναδικό όνομαμεταξύ όλων των θυρών του εγγράφου WSDL. Το χαρακτηριστικό binding του τύπου QName περιέχει μια αναφορά στο binding (βλ.).

Τα στοιχεία επέκτασης (1) χρησιμοποιούνται για τον καθορισμό της διεύθυνσης.

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

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

Υπηρεσία

Μια υπηρεσία συνδυάζει ένα σύνολο σχετικών θυρών.

  1. <wsdl:ορισμούς .... >
  2. <wsdl:υπηρεσίαόνομα = "nmtoken" > *
  3. <wsdl:λιμάνι .... /> *
  4. wsdl:υπηρεσία>
  5. wsdl:ορισμούς>

Το χαρακτηριστικό name καθορίζει ένα μοναδικό όνομα μεταξύ όλων των υπηρεσιών που ορίζονται στο έγγραφο WSDL.

Οι θύρες σε μια υπηρεσία συνδέονται ως εξής:

  • Οι θύρες δεν επικοινωνούν μεταξύ τους (δηλαδή, η έξοδος μιας θύρας δεν είναι η είσοδος μιας άλλης).
  • Εάν μια υπηρεσία έχει πολλές θύρες που μοιράζονται έναν κοινό τύπο θύρας αλλά χρησιμοποιούν διαφορετικές συνδέσεις ή έχουν διαφορετικές διευθύνσεις, αυτές οι θύρες είναι εναλλακτικές θύρες. Κάθε τέτοια θύρα εφαρμόζει λογικά ισοδύναμη συμπεριφορά (εντός των περιορισμών μεταφοράς και μορφής μηνύματος που επιβάλλονται από την αντίστοιχη δέσμευση). Αυτό επιτρέπει στον πελάτη να επιλέξει μια συγκεκριμένη θύρα για επικοινωνία με βάση διάφορα κριτήρια (υποστήριξη πρωτόκολλο μεταφοράςκαι τα λοιπά.).
  • Εξετάζοντας τις θύρες, μπορείτε να προσδιορίσετε ποιοι τύποι θυρών υποστηρίζονται από την υπηρεσία. Με βάση αυτά τα δεδομένα, ο πελάτης μπορεί να καθορίσει τη δυνατότητα αλληλεπίδρασης με μια συγκεκριμένη υπηρεσία. Αυτό είναι χρήσιμο εάν υπονοείται μια σχέση μεταξύ πράξεων από διαφορετικών τύπων ports, και για να εκτελέσει μια συγκεκριμένη εργασία, η υπηρεσία πρέπει να υποστηρίζει όλους τους απαιτούμενους τύπους θυρών.
  1. Αυτή είναι μια δωρεάν, μερική, διευρυμένη μετάφραση του εγγράφου Web Services Description Language (WSDL) 1.1 με ημερομηνία 15 Μαρτίου 2001
  2. Είναι εξαιρετικά άβολο να λειτουργείς με άρρητους όρους γραμμένους στα λατινικά, και επίσης μεταφράζονται ξεκάθαρα. Επομένως, το αρχικό όνομα δίνεται μόνο όταν εισάγεται ένας νέος όρος και περαιτέρω στο κείμενο χρησιμοποιείται η ρωσική μετάφραση.

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

Εισαγωγή

Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως 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. Υπάρχει μια διαδικτυακή υπηρεσία, δηλ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία Ιστού και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο 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=επιστροφή "Γεια, " + όνομα + "!" ; src) ) Ας ξεκινήσουμε την υπηρεσία ιστού μας ως ανεξάρτητος διακομιστής, π.χ. χωρίς τη συμμετοχή οποιουδήποτε διακομιστή Tomcat και εφαρμογών (αυτό είναι ένα θέμα για ξεχωριστή συζήτηση). Για να το κάνετε αυτό, στη δομή του έργου στο φάκελο Ας δημιουργήσουμε ένα πακέτο ru.javarush.endpoint και σε αυτό θα δημιουργήσουμε μια κλάση HelloWebServicePublisher με μια μέθοδο main: πακέτο ru. javarush. τελικό σημείο?// κλάση για τη λειτουργία ενός διακομιστή web με υπηρεσίες web εισαγωγή javax. xml. ws. Τελικό σημείο;// κατηγορία της διαδικτυακής μας υπηρεσίας εισαγωγή ru. javarush. ws. HelloWebServiceImpl; δημόσια τάξη HelloWebServicePublisher ( δημόσιο static void main (String... args) ( // εκκίνηση του διακομιστή web στη θύρα 1986// και στη διεύθυνση που καθορίζεται στο πρώτο όρισμα, // εκκίνηση της υπηρεσίας web που μεταβιβάστηκε στο δεύτερο όρισμαΤελικό σημείο. δημοσιεύω( "http://localhost:1986/wss/hello", νέο HelloWebServiceImpl () );

) ) Τώρα ας εκτελέσουμε αυτήν την κλάση κάνοντας κλικ

Shift+F10 src. Δεν θα εμφανιστεί τίποτα στην κονσόλα, αλλά ο διακομιστής εκτελείται. Μπορείτε να το επαληθεύσετε πληκτρολογώντας τη γραμμή http://localhost:1986/wss/hello?wsdl στο πρόγραμμα περιήγησής σας. Η σελίδα που ανοίγει, αφενός, αποδεικνύει ότι έχουμε έναν διακομιστή web (http://) που εκτελείται στη θύρα 1986 στον υπολογιστή μας (localhost) και, αφετέρου, δείχνει μια περιγραφή WSDL της υπηρεσίας web μας. Εάν διακόψετε την εφαρμογή, η περιγραφή δεν θα είναι διαθέσιμη, όπως και η ίδια η υπηρεσία web, επομένως δεν θα το κάνουμε αυτό, αλλά θα προχωρήσουμε στη σύνταξη του πελάτη. Πελάτης Στο φάκελο του έργουΑς δημιουργήσουμε ένα πακέτο 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, Service service= Υπηρεσία. δημιουργία (url, qname) ; // και στη συνέχεια μέχρι την ετικέτα θύρας που είναι ένθετη σε αυτήν, έτσι ώστε // λάβετε έναν σύνδεσμο προς ένα αντικείμενο υπηρεσίας ιστού που είναι απομακρυσμένο από εμάς HelloWebService γεια = υπηρεσία. getPort(HelloWebService.class); // Ωραία! Τώρα μπορείτε να καλέσετε την απομακρυσμένη μέθοδοΣύστημα. έξω. println (γεια. getHelloString ("JavaRush") );

) ) Έδωσα τα μέγιστα σχόλια για τον κωδικό στην καταχώριση. Δεν έχω τίποτα να προσθέσω, οπότε ας τρέξουμε (Shift+F10). Θα πρέπει να δούμε το κείμενο στην κονσόλα: Γεια σου, JavaRush! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.

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

Τα στοιχεία επέκτασης δέσμευσης χρησιμοποιούνται για τον καθορισμό μιας συγκεκριμένης γραμματικής για εισερχόμενα (3) και εξερχόμενα (4) μηνύματα σφάλματος (5). Μπορούν επίσης να καθοριστούν πληροφορίες για το επίπεδο λειτουργίας (2) και το επίπεδο σύνδεσης (1).

Το στοιχείο σύνδεσης λειτουργίας περιέχει δεδομένα για τη λειτουργία με το ίδιο όνομα του συσχετισμένου τύπου θύρας. Ωστόσο, το όνομα της λειτουργίας γενικά δεν είναι μοναδικό (παράδειγμα: υπερφόρτωση μεθόδων / συναρτήσεων - χρήση των ίδιων ονομάτων με διαφορετικές υπογραφές), επομένως μπορεί να μην είναι αρκετός ο μοναδικός προσδιορισμός της λειτουργίας στόχου του τύπου θύρας. Σε τέτοιες περιπτώσεις, η λειτουργία προορισμού αντιμετωπίζεται καθορίζοντας επιπλέον τα κατάλληλα ονόματα στοιχείων wsdl:input και wsdl:output χρησιμοποιώντας το χαρακτηριστικό name.

Δεσμευτικός πρέπειεγκαταστήστε μόνο ένα πρωτόκολλο.

Δεσμευτικός δεν θα έπρεπεπεριέχει πληροφορίες διεύθυνσης.

Λιμάνι

Μια θύρα ορίζει ένα μόνο τελικό σημείο ορίζοντας μια διεύθυνση προς σύνδεση.

  1. <wsdl:ορισμούς .... >
  2. <wsdl:υπηρεσία .... > *
  3. <wsdl:λιμάνι name = "nmtoken" binding = "qname" > *
  4. <-- extensibility element (1) -->
  5. wsdl:λιμάνι>
  6. wsdl:υπηρεσία>
  7. wsdl:ορισμούς>

UPD.

Τα στοιχεία επέκτασης (1) χρησιμοποιούνται για τον καθορισμό της διεύθυνσης.

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

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

Υπηρεσία

Μια υπηρεσία συνδυάζει ένα σύνολο σχετικών θυρών.

  1. <wsdl:ορισμούς .... >
  2. <wsdl:υπηρεσίαόνομα = "nmtoken" > *
  3. <wsdl:λιμάνι .... /> *
  4. wsdl:υπηρεσία>
  5. wsdl:ορισμούς>

Το χαρακτηριστικό name καθορίζει ένα μοναδικό όνομα μεταξύ όλων των υπηρεσιών που ορίζονται στο έγγραφο WSDL.

Οι θύρες σε μια υπηρεσία συνδέονται ως εξής:

  • Οι θύρες δεν επικοινωνούν μεταξύ τους (δηλαδή, η έξοδος μιας θύρας δεν είναι η είσοδος μιας άλλης).
  • Το χαρακτηριστικό name καθορίζει ένα μοναδικό όνομα μεταξύ όλων των θυρών στο έγγραφο WSDL. Το χαρακτηριστικό binding του τύπου QName περιέχει μια αναφορά στο binding (βλ.).
  • Εάν μια υπηρεσία έχει πολλές θύρες που μοιράζονται έναν κοινό τύπο θύρας αλλά χρησιμοποιούν διαφορετικές συνδέσεις ή έχουν διαφορετικές διευθύνσεις, αυτές οι θύρες είναι εναλλακτικές θύρες. Κάθε τέτοια θύρα εφαρμόζει λογικά ισοδύναμη συμπεριφορά (εντός των περιορισμών μεταφοράς και μορφής μηνύματος που επιβάλλονται από την αντίστοιχη δέσμευση). Αυτό επιτρέπει στον πελάτη να επιλέξει μια συγκεκριμένη θύρα για επικοινωνία με βάση διάφορα κριτήρια (υποστήριξη πρωτοκόλλου μεταφοράς κ.λπ.).
  1. Αυτή είναι μια δωρεάν, μερική, διευρυμένη μετάφραση του εγγράφου Web Services Description Language (WSDL) 1.1 με ημερομηνία 15 Μαρτίου 2001
  2. Είναι εξαιρετικά άβολο να λειτουργείς με άρρητους όρους γραμμένους στα λατινικά, και επίσης μεταφράζονται ξεκάθαρα. Επομένως, το αρχικό όνομα δίνεται μόνο όταν εισάγεται ένας νέος όρος και περαιτέρω στο κείμενο χρησιμοποιείται η ρωσική μετάφραση.

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

Εισαγωγή

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

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

Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η υπηρεσία ιστού μας και μερικές φορές ονομάζεται τελικό σημείο (όπως στο τελικό σημείο όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:
  1. Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
  2. Εφαρμογή αυτής της διεπαφής
  3. Εκκινήστε την υπηρεσία web μας
  4. Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως την επιθυμητή μέθοδο υπηρεσίας web
Μπορείτε να εκκινήσετε μια υπηρεσία Ιστού με διαφορετικούς τρόπους: είτε να περιγράψετε μια κλάση με την κύρια μέθοδο και να εκκινήσετε την υπηρεσία Ιστού απευθείας ως διακομιστής, είτε να την αναπτύξετε σε έναν διακομιστή όπως ο Tomcat ή οποιοσδήποτε άλλος. Στη δεύτερη περίπτωση, εμείς οι ίδιοι δεν εκκινούμε έναν νέο διακομιστή και δεν ανοίγουμε άλλη θύρα στον υπολογιστή, αλλά απλώς πείτε στο κοντέινερ servlet Tomcat ότι «έχουμε γράψει μαθήματα διαδικτυακής υπηρεσίας εδώ, παρακαλούμε δημοσιεύστε τα ώστε όλοι όσοι επικοινωνούν μαζί σας να μπορούν χρησιμοποιήστε τη χρήση της υπηρεσίας web." Ανεξάρτητα από τη μέθοδο εκκίνησης της υπηρεσίας web, θα έχουμε τον ίδιο πελάτη.

Υπηρέτης

Ας ξεκινήσουμε το IDEA και ας δημιουργήσουμε ένα νέο έργο Δημιουργία νέου έργου. Ας υποδείξουμε το όνομα HelloWebServiceκαι πατήστε το κουμπί Επόμενος, μετά κουμπί Φινίρισμα. Σε ένα φάκελο srcας δημιουργήσουμε ένα πακέτο ru.javarush.ws. Σε αυτό το πακέτο θα δημιουργήσουμε τη διεπαφή HelloWebService: πακέτο ru. javarush. ws; // αυτοί είναι σχολιασμοί, δηλ. ένας τρόπος να επισημάνουμε τις τάξεις και τις μεθόδους μας, // σε σχέση με την τεχνολογία υπηρεσιών webεισαγωγή javax. jws. WebMethod; εισαγωγή javax. jws. WebService;εισαγωγή javax. jws. σαπούνι. SOAPBinding; // λέμε ότι η διεπαφή μας θα λειτουργεί ως υπηρεσία web@WebService // λέμε ότι η υπηρεσία Ιστού θα χρησιμοποιηθεί για την κλήση μεθόδων@SOAPBinding (στυλ = SOAPBinding. Στυλ. RPC) δημόσια διεπαφή HelloWebService ( // λέμε ότι αυτή η μέθοδος μπορεί να κληθεί εξ αποστάσεως@WebMethod δημόσια συμβολοσειρά getHelloString(Όνομα συμβολοσειράς) ; ) Σε αυτόν τον κώδικα, οι κλάσεις WebService και WebMethod είναι οι λεγόμενοι σχολιασμοί και δεν κάνουν τίποτα εκτός από την επισήμανση της διεπαφής μας και της μεθόδου της ως υπηρεσίας web. Το ίδιο ισχύει και για την κατηγορία SOAPBinding. Η μόνη διαφορά είναι ότι το SOAPBinding είναι ένας σχολιασμός με παραμέτρους. Σε αυτήν την περίπτωση, η παράμετρος στυλ χρησιμοποιείται με μια τιμή που υποδεικνύει ότι η υπηρεσία web δεν θα λειτουργεί μέσω μηνυμάτων εγγράφων, αλλά ως κλασικό RPC, π.χ. για να καλέσετε μια μέθοδο. Ας εφαρμόσουμε τη λογική διεπαφής μας και ας δημιουργήσουμε μια κλάση HelloWebServiceImpl στο πακέτο μας. Παρεμπιπτόντως, σημειώνω ότι ο τερματισμός μιας κλάσης με Impl είναι μια σύμβαση στην Java, σύμφωνα με την οποία η υλοποίηση των διεπαφών ορίζεται έτσι (Impl - από τη λέξη υλοποίηση, δηλ. υλοποίηση). Αυτό δεν είναι απαίτηση και είστε ελεύθεροι να ονομάσετε την τάξη όπως θέλετε, αλλά οι καλοί τρόποι το απαιτούν: πακέτο ru. javarush. ws; // υποδεικνύοντας το πλήρες όνομα της κλάσης διεπαφής της υπηρεσίας ιστού μας// υποδεικνύοντας ονοματεπώνυμοκλάση διεπαφής της διαδικτυακής μας υπηρεσίας @WebService(endpointInterface=επιστροφή "Γεια, " + όνομα + "!" ; src) ) Ας ξεκινήσουμε την υπηρεσία ιστού μας ως ανεξάρτητος διακομιστής, π.χ. χωρίς τη συμμετοχή οποιουδήποτε διακομιστή Tomcat και εφαρμογών (αυτό είναι ένα θέμα για ξεχωριστή συζήτηση). Για να το κάνετε αυτό, στη δομή του έργου στο φάκελο Ας δημιουργήσουμε ένα πακέτο ru.javarush.endpoint και σε αυτό θα δημιουργήσουμε μια κλάση HelloWebServicePublisher με μια μέθοδο main: πακέτο ru. javarush. τελικό σημείο?// κλάση για τη λειτουργία ενός διακομιστή web με υπηρεσίες web εισαγωγή javax. xml. ws. Τελικό σημείο;// κατηγορία της διαδικτυακής μας υπηρεσίας εισαγωγή ru. javarush. ws. HelloWebServiceImpl; δημόσια τάξη HelloWebServicePublisher ( δημόσιο static void main (String... args) ( // εκκίνηση του διακομιστή web στη θύρα 1986// και στη διεύθυνση που καθορίζεται στο πρώτο όρισμα, // εκκίνηση της υπηρεσίας web που μεταβιβάστηκε στο δεύτερο όρισμαΤελικό σημείο. δημοσιεύω( "http://localhost:1986/wss/hello", νέο HelloWebServiceImpl () );

) ) Τώρα ας εκτελέσουμε αυτήν την κλάση κάνοντας κλικ

Shift+F10 src. Δεν θα εμφανιστεί τίποτα στην κονσόλα, αλλά ο διακομιστής εκτελείται. Μπορείτε να το επαληθεύσετε πληκτρολογώντας τη γραμμή http://localhost:1986/wss/hello?wsdl στο πρόγραμμα περιήγησής σας. Η σελίδα που ανοίγει, αφενός, αποδεικνύει ότι έχουμε έναν διακομιστή web (http://) που εκτελείται στη θύρα 1986 στον υπολογιστή μας (localhost) και, αφετέρου, δείχνει μια περιγραφή WSDL της υπηρεσίας web μας. Εάν διακόψετε την εφαρμογή, η περιγραφή δεν θα είναι διαθέσιμη, όπως και η ίδια η υπηρεσία web, επομένως δεν θα το κάνουμε αυτό, αλλά θα προχωρήσουμε στη σύνταξη του πελάτη. Πελάτης Στο φάκελο του έργουΑς δημιουργήσουμε ένα πακέτο ru.javarush.client , και σε αυτό την κλάση HelloWebServiceClient με την κύρια μέθοδο: πακέτο ru. javarush. πελάτης; // απαιτείται για να λάβετε την περιγραφή wsdl και μέσω αυτής// πρόσβαση στην ίδια την υπηρεσία web εισαγωγή java. καθαρά. URL? // Αυτή η εξαίρεση θα προκύψει όταν εργάζεστε με ένα αντικείμενο URLεισαγωγή java. καθαρά. MalformedURLException; // κλάσεις για ανάλυση xml με περιγραφή wsdl// και μεταβείτε στην ετικέτα υπηρεσίας σε αυτήν εισαγωγή javax. xml. χώρο ονομάτων. QName; URL URL = νέα διεύθυνση URL ( εισαγωγή ru. javarush. ws. HelloWebService;) ; δημόσια κλάση HelloWebServiceClient ( δημόσιο στατικό κενό main (String args) ρίχνει MalformedURLException ( // δημιουργήστε έναν σύνδεσμο προς την περιγραφή wsdl // κοιτάξτε το 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! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.

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

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

Χάρτης άρθρου

Τι είναι το WSDL

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

Η διαδρομή προς το αρχείο wsdl συνήθως μοιάζει με http://host/services/wsdl/gbdar-v2-2.wsdl

Υπάρχουν πολλά εργαλεία, βιβλιοθήκες που έχουν σχεδιαστεί για να διαβάζουν ένα αρχείο WSDL.

SoapUi

Ένα τέτοιο εργαλείο είναι το soapUi(). Αφού εγκαταστήσετε τη διανομή που έχει σχεδιαστεί για την πλατφόρμα σας, μπορείτε να δημιουργήσετε ένα νέο έργο χρησιμοποιώντας την εντολή File/New SoapUi project. Στο παράθυρο διαλόγου για τη δημιουργία ενός νέου έργου, αφήστε ενεργοποιημένο το πλαίσιο ελέγχου Δημιουργία δειγμάτων αιτημάτων

Εκτέλεση ερωτημάτων

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

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

Το SoapUi παρέχει τη δυνατότητα προβολής των παραμέτρων ενός αρχείου WSDL για να το κάνετε αυτό, πρέπει να κάνετε διπλό κλικ στο όνομα της διεπαφής (σημειωμένο με ένα πράσινο εικονίδιο στο δέντρο αρχείων WSDL, για μένα - gdbar-v2-2SOAP). Στο παράθυρο διαλόγου μπορείτε να βρείτε:

  • Καρτέλα Επισκόπηση - περιγραφή γενικές παραμέτρους WSDL, μια λίστα λειτουργιών και σχετικών ενεργειών διακομιστή
  • Καρτέλα τελικών σημείων υπηρεσίας — διαδρομή προς τον διακομιστή και άλλες παράμετροι
  • Περιεχόμενο WSDL - δέντρο πλοήγησης αρχείων
  • Συμμόρφωση WS-I — εδώ μπορείτε να δημιουργήσετε μια αναφορά WS-I στη διεπαφή

Δημιουργία τεκμηρίωσης

Το SoapUi μας επιτρέπει να δημιουργήσουμε τεκμηρίωση λειτουργίας WSDL. Για να το κάνετε αυτό, κάντε κλικ δεξί κλικμέσω της διεπαφής και καλέστε την εντολή Δημιουργία τεκμηρίωσης.Ως αποτέλεσμα παίρνουμε αναλυτικό εγχειρίδιοσε μορφή html.

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