שירותי אינטרנט ב- Java SE, חלק 2: יצירת שירותי אינטרנט SOAP

JAX-WS תומך בשירותי אינטרנט מבוססי SOAP. חלק 2 מסדרה זו בת ארבעה חלקים בשירותי Java Java מגדיר שירות אינטרנט מבוסס המרת SOAP, בונה ואז מאמת שירות אינטרנט זה באופן מקומי באמצעות שרת ה- HTTP הקל המשמש כברירת מחדל (נדון בחלק 1), מפרש את מסמך WSDL של השירות. , וניגש לשירות מלקוח פשוט.

הגדרת שירות אינטרנט להמרת יחידות

שירות האינטרנט להמרת יחידות, שכיניתי UC, מורכב מארבע פונקציות להמרה בין סנטימטרים לאינץ 'ובין מעלות פרנהייט למעלות צלזיוס. למרות שניתן היה לארכז את הדוגמה הזו כמחלקת Java אחת, בחרתי לפעול לפי שיטות עבודה מומלצות על ידי ארכיטקטורה כממשק Java וכ- Java. רישום 1 מציג את UCממשק שירות האינטרנט .

רישום 1. ממשק נקודות הקצה של שירות האינטרנט של שירות ה- UC

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UCמתאר ממשק נקודות קצה (SEI) , שהוא ממשק Java החושף את פעולות ממשק שירות האינטרנט במונחים של שיטות Java מופשטות. הלקוחות מתקשרים עם שירותי אינטרנט מבוססי SOAP באמצעות ה- SEI שלהם.

UCמוכרז כ- SEI באמצעות @WebServiceההערה. כאשר מציינים ביאור ממשק או מחלקה של Java @WebService, כל publicהשיטות שהפרמטרים שלהן, ערכי ההחזר והחרגים המוצהרים עוקבות אחר הכללים שהוגדרו בסעיף 5 למפרט JAX-RPC 1.1 המתארים פעולות שירות אינטרנט. מכיוון שרק publicניתן הכריזו שיטות ממשקים, את publicהמילה שהמורה אינה הכרחית כאשר הכרזה c2f(), cm2in(), f2c(), ו in2cm(). שיטות אלה הן באופן מרומז public.

גם כל שיטה מסומנת @WebMethod. אמנם @WebMethodלא חיוני בדוגמה זו, אך נוכחותה מחזקת את העובדה שהשיטה המבוארת חושפת פעולת שירות אינטרנט.

רישום 2 מציג את UCImplהכיתה של שירות האינטרנט .

רישום 2. שעועית יישום השירות של שירות האינטרנט UC

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplמתאר שעועית יישום שירות (SIB) , המספקת יישום של ה- SEI. מעמד זה הוכרז כ- SIB באמצעות @WebService(endpointInterface = "ca.javajeff.uc.UC")ההערה. endpointInterfaceהאלמנט מתחבר SIB זו כדי שלה SEI, והוא נחוץ כדי למנוע טעויות מסוג הנמל מוגדרות בעת הפעלת יישום לקוח הציג מאוחר יותר.

implements UCהסעיף איננו הכרחי. אם סעיף זה אינו קיים, UCהממשק מתעלם (והוא מיותר). עם זאת, מומלץ לשמור implements UCכך שהמהדר יכול לוודא ששיטות ה- SEI יושמו ב- SIB.

כותרות השיטה של ​​ה- SIB אינן מבוארות @WebMethodמשום שהערה זו משמשת בדרך כלל בהקשר של ה- SEI. עם זאת, אם היית מוסיף publicשיטה (שתואמת את הכללים בסעיף 5 של מפרט JAX-RPC 1.1) ל- SIB, ואם שיטה זו אינה חושפת פעולת שירות אינטרנט, היית מציין את כותרת השיטה @WebMethod(exclude = true). כשאתה מקצה trueאל @WebMethodים" excludeאלמנט, אתה למנוע שיטה מלהיות קשור למבצע.

שירות אינטרנט זה מוכן לפרסום, כך שניתן יהיה לגשת אליו מלקוחות. רישום 3 מציג UCPublisherיישום שמבצע את המשימה הזו בהקשר לשרת HTTP הקל המשמש כברירת מחדל.

רישום 3. הוצאת UC

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

פרסום שירות האינטרנט כולל שיחה אחת לשיטת EndPointהכיתה של Endpoint publish(String address, Object implementor)הכיתה. addressמזהה פרמטר ה- URI שהוקצו לשירות האינטרנט. בחרתי לפרסם שירות אינטרנט זה במארח המקומי על ידי ציון localhost(שווה ערך לכתובת IP 127.0.0.1) ומספר היציאה 9901(אשר ככל הנראה זמין). כמו כן, בחרתי באופן שרירותי /UCכנתיב הפרסום. implementorפרמטר מזהה מופע של UCSIB ים".

publish()השיטה יוצרת ומפרסם נקודת סיום עבור שצוין implementorהאובייקט על הנתון address, ומשתמשת implementorהסברי ים" כדי ליצור שפת Definition שירותי האינטרנט (WSDL) ו- XML Schema מסמכים. זה גורם ליצירת ותשתית השרת הדרושה על ידי יישום JAX-WS בהתבסס על תצורת ברירת מחדל כלשהי. יתר על כן, שיטה זו גורמת ליישום לפעול ללא הגבלת זמן. (במחשבי Windows, לחץ בו זמנית על מקשי Ctrl ו- C כדי לסיים את היישום).

בנייה ואימות של שירות האינטרנט

לא קשה לבנות את שירות האינטרנט של UC שהוגדר בעבר. ראשית, עליך ליצור מבנה ספריות מתאים המכיל את הקבצים המתאימים. בצע משימה זו על ידי ביצוע השלבים הבאים:

  1. בתוך הספריה הנוכחית, צור caספריה. בתוך ca, צור javajeffספריה. לבסוף, בתוך javajeff, צור ucספריה.
  2. העתק רישום 1 UC.javaלקובץ מקור ושמור את הקובץ הזה ב ca/javajeff/uc.
  3. העתק את רישום 2 UCImpl.javaלקובץ מקור ושמור את הקובץ בו ca/javajeff/uc.
  4. העתק רישום 3 UCPublisher.javaלקובץ מקור ושמור קובץ זה בספריה הנוכחית, המכילה את caהספרייה.

המשימה הבאה היא לאסוף את קבצי המקור הללו. בהנחה שלא שינית ספריות, בצע את הפקודה הבאה כדי להרכיב קבצי מקור אלה ב- 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 UCPublisher

בזמן שהיישום פועל, השתמש בדפדפן אינטרנט כדי לוודא ששירות אינטרנט זה פועל כראוי וכדי לגשת למסמך WSDL שלו. הפעל את דפדפן האינטרנט המועדף עליך והזן את השורה הבאה בשורת הכתובת:

//localhost:9901/UC

איור 1 מציג את דף האינטרנט שהתקבל בדפדפן האינטרנט של Google Chrome.

איור 1. דף האינטרנט של UC מספק מידע מפורט על שירות האינטרנט שפורסם

איור 1 מציג את שמות השירות והיציאות המוסמכים של נקודת הקצה של שירות האינטרנט. (שימו לב ששם החבילה הופך - uc.javajeff.caבמקום ca.javajeff.uc). לקוח משתמש בשמות אלה כדי לגשת לשירות.

איור 1 מציג גם את כתובת ה- URI של שירות האינטרנט, את מיקום מסמך ה- WSDL של שירות האינטרנט (כתובת ה- URI של שירות האינטרנט המסופקת על ידי ?wsdlמחרוזת השאילתה), ואת השם המוסמך לחבילה של מחלקת הטמעת שירות האינטרנט.

פרשנות מסמך WSDL של שירות האינטרנט

המיקום של מסמך WSDL של שירות האינטרנט UC מוצג כקישור. לחץ על קישור זה כדי להציג את מסמך WSDL, שתוכנו מוצג ברשימה 4.

רישום 4. מסמך WSDL של UC

מסמך WSDL הוא מסמך XML עם definitionsאלמנט שורש, אשר עושה כלום מסמך WSDL יותר מאשר אוסף של הגדרות. אלמנט זה כולל שונים xmlnsהמאפיינים לזיהוי מרחבים שם סטנדרטיים שונים, יחד עם targetNameSpaceו nameתכונות:

  • targetNamespaceהתכונה יוצרת מרחב עבור כל האלמנטים המוגדרים על ידי המשתמש במסמך WSDL (כגון c2fהאלמנט המוגדר באמצעות messageהאלמנט בשם זה). מרחב שמות זה משמש להבחנה בין האלמנטים המוגדרים על ידי המשתמש של מסמך WSDL הנוכחי ואלמנטים המוגדרים על ידי משתמשים של מסמכי WSDL מיובאים, אשר מזוהים באמצעות importהאלמנט של WSDL . באופן דומה, targetNamespaceהתכונה המופיעה schemaבאלמנט של קובץ מבוסס XML Schema יוצרת מרחב שמות עבור רכיבי הסוג הפשוטים המוגדרים על ידי המשתמש, רכיבי התכונה ורכיבי הסוג המורכב.
  • nameתכונה המזהה את שירות האינטרנט והוא משמש רק כדי לתעד את השירות.

מקוננים definitionsהם types, message, portType, binding, ו serviceאלמנטים: