Προγραμματισμός

Υπηρεσίες Ιστού στο Java SE, Μέρος 2: Δημιουργία υπηρεσιών διαδικτύου SOAP

Το JAX-WS υποστηρίζει υπηρεσίες Web που βασίζονται σε SOAP. Το μέρος 2 αυτής της σειράς τεσσάρων τμημάτων στις υπηρεσίες Java SE Web καθορίζει μια υπηρεσία Web μετατροπής μονάδων με βάση το SOAP, δημιουργεί και στη συνέχεια επαληθεύει αυτήν την υπηρεσία Web τοπικά μέσω του προεπιλεγμένου ελαφρού διακομιστή HTTP (συζητείται στο Μέρος 1), ερμηνεύει το έγγραφο WSDL της υπηρεσίας , και αποκτά πρόσβαση στην υπηρεσία από έναν απλό πελάτη.

Καθορισμός μιας υπηρεσίας ιστού-μετατροπής μονάδων

Η υπηρεσία μετατροπής μονάδων Web, την οποία έχω ονομάσει UC, αποτελείται από τέσσερις λειτουργίες για μετατροπή μεταξύ εκατοστών και ιντσών και μεταξύ βαθμών Φαρενάιτ και βαθμών Κελσίου. Αν και αυτό το παράδειγμα θα μπορούσε να αρχειοθετηθεί ως μεμονωμένη κλάση Java, έχω επιλέξει να ακολουθώ τις βέλτιστες πρακτικές δημιουργώντας το ως διεπαφή Java και τάξη Java. Η λίστα 1 παρουσιάζει τις υπηρεσίες Web UC διεπαφή.

Λίστα 1. Η διεπαφή τελικού σημείου υπηρεσίας της υπηρεσίας Web UC

πακέτο ca.javajeff.uc; εισαγωγή javax.jws.WebMethod; εισαγωγή javax.jws.WebService; @WebService δημόσια διεπαφή UC {@WebMethod διπλό c2f (διπλοί βαθμοί); @WebMethod διπλά cm2in (διπλά cm); @WebMethod διπλό f2c (διπλοί βαθμοί); @WebMethod διπλά in2cm (double in); }

UC περιγράφει ένα Διεπαφή τελικού σημείου υπηρεσίας (SEI), η οποία είναι μια διεπαφή Java που εκθέτει τις λειτουργίες μιας διεπαφής υπηρεσίας Web σε όρους αφηρημένων μεθόδων Java. Οι πελάτες επικοινωνούν με υπηρεσίες Web που βασίζονται σε SOAP μέσω των SEI τους.

UC δηλώνεται ως SEI μέσω του @WebService σχόλιο. Όταν μια διεπαφή Java ή μια τάξη σχολιάζεται @WebService, όλα δημόσιο Οι μέθοδοι των οποίων οι παράμετροι, οι τιμές επιστροφής και οι δηλωμένες εξαιρέσεις ακολουθούν τους κανόνες που ορίζονται στην Ενότητα 5 της προδιαγραφής JAX-RPC 1.1 περιγράφουν τις λειτουργίες της υπηρεσίας Web. Επειδή μόνο δημόσιο μέθοδοι μπορούν να δηλωθούν σε διεπαφές, το δημόσιο δεσμευμένη λέξη δεν είναι απαραίτητη κατά τη δήλωση c2f (), cm2in (), f2c (), και σε 2 εκατοστά (). Αυτές οι μέθοδοι είναι σιωπηρά δημόσιο.

Κάθε μέθοδος σχολιάζεται επίσης @WebMethod. Παρόλο @WebMethod Δεν είναι απαραίτητο σε αυτό το παράδειγμα, η παρουσία του ενισχύει το γεγονός ότι η σχολιασμένη μέθοδος εκθέτει μια λειτουργία υπηρεσίας Web.

Η λίστα 2 παρουσιάζει τις υπηρεσίες Web UCImpl τάξη.

Λίστα 2. Το Bean υλοποίησης υπηρεσίας της υπηρεσίας Web UC

πακέτο ca.javajeff.uc; εισαγωγή javax.jws.WebService; @WebService (endpointInterface = "ca.javajeff.uc.UC") δημόσια τάξη UCIpl υλοποιεί UC {@ Override public double c2f (double degrees) {return βαθμοί * 9.0 / 5.0 + 32; } @ Override δημόσιο διπλό cm2in (διπλό cm) {return cm / 2,54; } @Override δημόσιο διπλό f2c (διπλοί βαθμοί) {return (βαθμοί - 32) * 5.0 / 9.0; } @Override public double in2cm (double in) {επιστροφή σε * 2,54; }}

UCImpl περιγράφει ένα Bean υλοποίησης υπηρεσίας (SIB), η οποία παρέχει μια εφαρμογή της SEI. Αυτή η τάξη δηλώνεται ως SIB μέσω του @WebService (endpointInterface = "ca.javajeff.uc.UC") σχόλιο. ο endpointInterface Το στοιχείο συνδέει αυτό το SIB με το SEI του και είναι απαραίτητο για να αποφευχθούν τα ακαθόριστα σφάλματα τύπου θύρας κατά την εκτέλεση της εφαρμογής πελάτη που παρουσιάζεται αργότερα.

ο εφαρμόζει UC η ρήτρα δεν είναι απολύτως απαραίτητη. Εάν αυτή η ρήτρα δεν υπάρχει, το UC η διεπαφή αγνοείται (και είναι περιττή). Ωστόσο, είναι καλή ιδέα να διατηρήσετε εφαρμόζει UC έτσι ο μεταγλωττιστής μπορεί να επαληθεύσει ότι οι μέθοδοι της SEI έχουν εφαρμοστεί στο SIB.

Οι κεφαλίδες της μεθόδου του SIB δεν επισημαίνονται @WebMethod επειδή αυτός ο σχολιασμός χρησιμοποιείται συνήθως στο πλαίσιο της SEI. Ωστόσο, εάν επρόκειτο να προσθέσετε ένα δημόσιο μέθοδος (η οποία συμμορφώνεται με τους κανόνες στην Ενότητα 5 της προδιαγραφής JAX-RPC 1.1) με το SIB και εάν αυτή η μέθοδος δεν εκθέτει μια λειτουργία υπηρεσίας Web, θα σχολιάζετε την κεφαλίδα της μεθόδου @WebMethod (exclude = true). Με ανάθεση αληθής προς την @WebMethod'μικρό αποκλείω στοιχείο, αποτρέπετε τη σύνδεση αυτής της μεθόδου με μια λειτουργία.

Αυτή η υπηρεσία Web είναι έτοιμη για δημοσίευση, ώστε να είναι προσβάσιμη από πελάτες. Η λίστα 3 παρουσιάζει α Εκδότης UCP εφαρμογή που εκτελεί αυτήν την εργασία στο πλαίσιο του προεπιλεγμένου ελαφρού διακομιστή HTTP.

Λίστα 3. Δημοσίευση UC

εισαγωγή javax.xml.ws.Endpoint; εισαγωγή ca.javajeff.uc.UCImpl; δημόσια κλάση UCP Publisher {public static void main (String [] args) {Endpoint.publish ("// localhost: 9901 / UC", νέο UCImpl ()); }}

Η δημοσίευση της υπηρεσίας Web περιλαμβάνει την πραγματοποίηση μιας κλήσης στο Endpoint της τάξης Δημοσίευση τελικού σημείου (διεύθυνση συμβολοσειράς, υλοποίηση αντικειμένου) μέθοδος τάξης. ο διεύθυνση Η παράμετρος προσδιορίζει το URI που έχει εκχωρηθεί στην υπηρεσία Web. Έχω επιλέξει να δημοσιεύσω αυτήν την υπηρεσία Web στον τοπικό κεντρικό υπολογιστή καθορίζοντας localhost (ισοδύναμο με τη διεύθυνση IP 127.0.0.1) και τον αριθμό θύρας 9901 (το οποίο είναι πιθανότατα διαθέσιμο). Επίσης, έχω επιλέξει αυθαίρετα / UC ως διαδρομή δημοσίευσης. ο εκτελεστής Η παράμετρος προσδιορίζει μια παρουσία του UCSIB.

ο δημοσιεύω() Η μέθοδος δημιουργεί και δημοσιεύει ένα τελικό σημείο για το καθορισμένο εκτελεστής αντικείμενο στο δεδομένο διεύθυνσηκαι χρησιμοποιεί το εκτελεστήςΣχολιασμοί για τη δημιουργία εγγράφων Web Definition Language (WSDL) και XML Schema. Προκαλεί τη δημιουργία και τη διαμόρφωση της απαραίτητης υποδομής διακομιστή από την υλοποίηση JAX-WS με βάση κάποια προεπιλεγμένη διαμόρφωση. Επιπλέον, αυτή η μέθοδος προκαλεί την εκτέλεση της εφαρμογής επ 'αόριστον. (Σε υπολογιστές με Windows, πατήστε ταυτόχρονα τα πλήκτρα Ctrl και C για να τερματίσετε την εφαρμογή.)

Δημιουργία και επαλήθευση της υπηρεσίας διαδικτύου

Δεν είναι δύσκολο να δημιουργηθεί η υπηρεσία Web UC που είχε οριστεί προηγουμένως. Αρχικά, πρέπει να δημιουργήσετε μια κατάλληλη δομή καταλόγου που να περιέχει τα κατάλληλα αρχεία. Ολοκληρώστε αυτήν την εργασία εκτελώντας τα ακόλουθα βήματα:

  1. Μέσα στον τρέχοντα κατάλογο, δημιουργήστε ένα περ Ευρετήριο. Στα πλαίσια περ, δημιουργώ ένα javajeff Ευρετήριο. Τέλος, εντός javajeff, δημιουργώ ένα UCI Ευρετήριο.
  2. Αντιγραφή καταχώρισης 1 σε α UC.java αρχείο προέλευσης και αποθηκεύστε αυτό το αρχείο ca / javajeff / uc.
  3. Αντιγράψτε την καταχώριση 2 στο α UCImpl.java αρχείο προέλευσης και αποθηκεύστε αυτό το αρχείο ca / javajeff / uc.
  4. Αντιγράψτε την καταχώριση 3 στο α UCPublisher.java αρχείο προέλευσης και αποθηκεύστε αυτό το αρχείο στον τρέχοντα κατάλογο, ο οποίος περιέχει το περ Ευρετήριο.

Η επόμενη εργασία είναι να συντάξετε αυτά τα αρχεία προέλευσης. Υποθέτοντας ότι δεν έχετε αλλάξει καταλόγους, εκτελέστε την ακόλουθη εντολή για να μεταγλωττίσετε αυτά τα αρχεία προέλευσης στο Java SE 9 (παραλείψτε --add-modules java.xml.ws σε Java SE 6, 7 ή 8):

javac --add-modules java.xml.ws UCPublisher.java

Εάν αυτά τα αρχεία προέλευσης μεταγλωττιστούν με επιτυχία, εκτελέστε την ακόλουθη εντολή για να εκτελέσετε αυτήν την εφαρμογή στην Java 9 (παραλείψτε --add-modules java.xml.ws σε Java SE 6, 7 ή 8):

java --add-modules java.xml.ws UCP Publisher

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

// localhost: 9901 / UC

Το σχήμα 1 δείχνει την προκύπτουσα ιστοσελίδα στο πρόγραμμα περιήγησης Ιστού Google Chrome.

Σχήμα 1. Η ιστοσελίδα της UC παρέχει λεπτομερείς πληροφορίες για τη δημοσιευμένη υπηρεσία Web

Το Σχήμα 1 παρουσιάζει την ειδική υπηρεσία και τα ονόματα θύρας του τελικού σημείου της υπηρεσίας Web. (Σημειώστε ότι το όνομα του πακέτου έχει αντιστραφεί - uc.javajeff.ca αντί ca.javajeff.uc). Ένας πελάτης χρησιμοποιεί αυτά τα ονόματα για πρόσβαση στην υπηρεσία.

Το Σχήμα 1 παρουσιάζει επίσης τη διεύθυνση URI της υπηρεσίας Web, τη θέση του εγγράφου WSDL της υπηρεσίας Web (το URI υπηρεσίας Web που επιτίθεται από το wsdl συμβολοσειρά ερωτήματος) και το όνομα κατάλληλου για πακέτο της κλάσης υλοποίησης υπηρεσίας Web.

Ερμηνεία του εγγράφου WSDL της υπηρεσίας ιστού

Η τοποθεσία του εγγράφου WSDL της υπηρεσίας Web UC παρουσιάζεται ως σύνδεσμος. Κάντε κλικ σε αυτόν τον σύνδεσμο για να δείτε το έγγραφο WSDL, του οποίου τα περιεχόμενα παρουσιάζονται στην Λίστα 4.

Λίστα 4. Το έγγραφο WSDL της UC

ΕΝΑ Έγγραφο WSDL είναι ένα έγγραφο XML με ένα ορισμοί στοιχείο ρίζας, το οποίο κάνει ένα έγγραφο WSDL τίποτα περισσότερο από ένα σύνολο ορισμών. Αυτό το στοιχείο περιλαμβάνει διάφορα xmlns χαρακτηριστικά για τον προσδιορισμό διαφόρων τυπικών ονομάτων, μαζί με targetNameSpace και όνομα γνωρίσματα:

  • ο targetNamespace Το χαρακτηριστικό δημιουργεί ένα χώρο ονομάτων για όλα τα στοιχεία που ορίζονται από το χρήστη στο έγγραφο WSDL (όπως το γ2στ στοιχείο που ορίζεται μέσω του μήνυμα στοιχείο με αυτό το όνομα). Αυτός ο χώρος ονομάτων χρησιμοποιείται για τη διάκριση μεταξύ των στοιχείων που καθορίζονται από το χρήστη του τρέχοντος εγγράφου WSDL και των στοιχείων που καθορίζονται από τον χρήστη των εισαγόμενων εγγράφων WSDL, τα οποία προσδιορίζονται μέσω των WSDL's εισαγωγή στοιχείο. Με παρόμοιο τρόπο, το targetNamespace χαρακτηριστικό που εμφανίζεται σε ένα αρχείο που βασίζεται σε σχήμα XML σχήμα Το στοιχείο δημιουργεί ένα χώρο ονομάτων για στοιχεία απλού τύπου, καθορισμένα από τον χρήστη, στοιχεία σύνθετου τύπου.
  • ο όνομα Το χαρακτηριστικό αναγνωρίζει την υπηρεσία Web και χρησιμοποιείται μόνο για την τεκμηρίωση της υπηρεσίας.

Ένθετο εντός ορισμοί είναι τύποι, μήνυμα, portType, δεσμευτικός, και υπηρεσία στοιχεία: