JavaRush /בלוג Java /Random-HE /שירותי אינטרנט. שלב 2. איך לפשט את כתיבת הלקוח?
eGarmin
רָמָה

שירותי אינטרנט. שלב 2. איך לפשט את כתיבת הלקוח?

פורסם בקבוצה
בהערה מהירה זו, ברצוני לעיין מחדש בקוד לקוח שירות האינטרנט שכתבנו בשלב הקודם . במקרה זה, אניח שיש לך IDEA פתוח, ובו הפרויקט משלב 1. שירות האינטרנט שלנו אמור להיות מושק בפרויקט זה:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;

// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;

public class HelloWebServiceClient {
    public static void main(String[] args) throws MalformedURLException {
        // создаем ссылку на wsdl описание
        URL url = new URL("http://localhost:1986/wss/hello?wsdl");

        // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
        // 1-ый аргумент смотрим в атрибуте targetNamespace
        // 2-ой аргумент смотрим в атрибуте name
        QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");

        // Теперь мы можем дотянуться до тега service в wsdl описании,
        Service service = Service.create(url, qname);
        // а далее и до вложенного в него тега port, чтобы
        // получить ссылку на удаленный от нас an object веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
שימו לב כמה אנחנו צריכים לדעת מראש. בנוסף לעובדה שאתה צריך גישה לתיאור ה-wsdl (בלי זה, מצטער, אין דרך):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
אתה צריך לפתוח את קובץ ה-XML הזה בעצמך ולהסתכל על התג definitions, ובו את התכונות targetNamespaceולקרוא nameלבנאי QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
אז אתה צריך להתחבר ידנית לתג service:
Service service = Service.create(url, qname);
ובתוכו לתגית port:
HelloWebService hello = service.getPort(HelloWebService.class);
ורק לאחר מכן נוכל לקרוא לשיטה המרוחקת:
hello.getHelloString("JavaRush")
השאלה היא: האם בגלל זה הסבים שלנו מתו בשדות הקרב, כדי שעכשיו אנחנו עושים הכל ביד? ואם זה אפילו לא שירות האינטרנט שלנו, אלא של מישהו אחר. אז התהליך הזה יהיה אפילו יותר לא נעים. פורמט ה-XML נועד להיקרא על ידי מכונות, לא בני אדם. אז בואו ניתן למכונה לעשות את העבודה המלוכלכת ונהנה מהתהליך. בשביל זה, אנחנו לא צריכים לעשות שום דבר מיוחד, כי... ה-SDK האהוב עלינו, הנקרא JDK ב-Java, כולל כלי עזר מיוחד בשם wsimport . אבל דבר ראשון... ראשית, בואו ניצור פרויקט חדש ב-IDEA על ידי בחירה בקובץ > פרויקט חדש... מהתפריט ומתן לפרויקט את השם HelloWS . כששואלים אותנו היכן לפתוח את הפרויקט החדש שנוצר, אנחנו צריכים לענות New Window , כלומר. בחלון חדש, כי אציין שוב שחשוב מאוד שהפרויקט הקודם יהיה פתוח, כי אנו זוכרים משלב 1 ששירות האינטרנט שלנו פועל בפרויקט הזה. אתה יכול, כמובן, פשוט להפעיל אותו דרך קונסולת Windows, אבל אני לא אוהב לעשות את זה. מהפרויקט החדש, פתח את המסוף על ידי בחירה ב- View > Tool Windows > Terminal , או פשוט לחיצה על Alt+F12 . עכשיו אנחנו בשורש הפרוייקט, ואנחנו צריכים להיכנס לתיקיית src , אז אנחנו מכניסים את הפקודה הבאה לקונסולה: cd src עכשיו הגיע הזמן להשתמש בכלי השירות wsimport . זה עובד על העיקרון הבא: אנחנו מעבירים לו תיאור WSDL , ובתגובה הוא יוצר קבצי stub (מה שנקרא Stub-classes), שכבר מכילים את כל הפונקציונליות שאנחנו צריכים כדי לגשת לשירות האינטרנט. שיעורים אלו ימוקם בחבילה ru.javarush.ws. אם תשאל מאיפה מגיע שם החבילה, התשובה היא: שם החבילה הוא מרחב השמות של היעד ההפוך מתיאור ה- WSDL . זכור את התכונה targetNamespaceבתג definitionsמה- WSDL . שם כתבנו את הדברים הבאים http:// ws.javarush.ru/. וזו לא כתובת האתר, כך נהוג לתאר מרחבי שמות ב-xml, ואם נזרוק http://ונרחיב את מה שנשאר בסדר הפוך, נקבל את שם החבילה שלנו. אז בואו נריץ את כלי השירות: wsimport -keep http://localhost:1986/wss/hello?wsdl כדי שהוא יעבוד, הנתיב אליו חייב להיות מוגדר במשתנה הסביבה PATH , או שאתה יכול פשוט להשתמש בנתיב המלא אליו. עבורי הוא ממוקם בתיקייה C:\Program Files\Java\jdk1.8.0_31\bin . שים לב שכל מה שאתה צריך לעשות הוא להעביר את קובץ ה-WSDL באמצעות מקש –keep , הזמין מרחוק דרך קישור, אלא אם כן, כמובן, השבתנו את שירות האינטרנט. מה זה שיעורי הסטאב האלה? יש רק שניים מהם. אחד מהם הואHelloWebService, שהוא בעצם אותו ממשק שירות אינטרנט שיצרנו ידנית בשלב 1. ההבדל הוא מזערי והוא נעוץ בכך שהביאורים שכבר נתקלנו בשימוש מעט שונה, ובנוסף, נעשה שימוש בהערות נוספות, אשר ציינתי שאני לא יודע כלום, אבל מכיוון שהכל עבד לנו בלעדיהם בעבר, אז ברור שהם לא חובה. המחלקה השנייה היא stub HelloWebServiceImplService, שיורשת מהכיתה Service. כבר נתקלנו במעמד Serviceאצל הלקוח שלנו. אני לא אתן את הקוד של השיעור הזה, כי... אני בקושי מוכן להסביר את כל השורות שלו, אבל המהות של המחלקה מסתכמת בכך שכל מה שכתבנו בעבר בלקוח באופן ידני כדי להתחבר לשירות האינטרנט נוצר אוטומטית במחלקה הזו ואנחנו רק צריכים התקשר לאחת השיטות שלה והכל יהיה פתוח. אז בואו נכתוב מחדש את הקוד של הלקוח שלנו בפרויקט חדש באמצעות המחלקות הללו ונוודא שהקוד תמציתי יותר. ראשית, בתיקיית src של הפרוייקט החדש, בואו ניצור חבילה ru.javarush.client, ובתוכה מחלקה HelloWebServiceClientעם מתודה main:
package ru.javarush.client;

// подключаем классы-заглушки
import ru.javarush.ws.*;

public class HelloWebServiceClient {
    public static void main(String[] args) {
        // подключаемся к тегу service в wsdl описании
        HelloWebServiceImplService helloService = new HelloWebServiceImplService();
        // получив информацию из тега service подключаемся к самому веб-сервису
        HelloWebService hello = helloService.getHelloWebServiceImplPort();

        // обращаемся к веб-сервису и выводим результат в консоль
        System.out.println( hello.getHelloString("JavaRush Community") );
    }
}
ניתוח הקוד הוא אלמנטרי ומה שתיארתי בהערות די מספיק. לאחר השקת הלקוח, עלינו לראות את השורה: Hello, JavaRush Community!במקביל, הלקוח מהפרויקט משלב 1 ימשיך לעבוד ולהציג את הטקסט שלו שכתבנו בו, כלומר: Hello, JavaRush! בשלב זה, אולי, נוכל לסיים את זה צעד, כי המטרה שלו הושגה. הבנו שאם יש תיאור WSDL של שירות אינטרנט, אז jdk מוכן לספק לנו יצירה אוטומטית stubשל מחלקות סתימות כדי לפשט את כתיבת הלקוח עבור שירות האינטרנט הזה. לדעתי, זוהי תכונה שימושית מאוד כאשר אתה רוצה לבדוק את שירות האינטרנט של מישהו אחר ולא להציץ לתיאור ה-WSDL שלו . מבט אל העתיד במאמר הבא על שירותי אינטרנט, ברצוני לשרטט רעיונות כיצד לפרוס שירות אינטרנט לתוך קונטיינר של Tomcat servlet ולתוך שרתי יישומים שונים, כך שלא תצטרך להפעיל את שירות האינטרנט בתור יישום נפרד, כפי שעשינו ב-2 השלבים הראשונים. אבל לפני כן, אני חושב שעדיף לעשות סטייה קצרה על הנושא של מה הם servlets, servlet containers וכיצד הם שונים משרתי יישומים ואינטרנט רגיל... . בנוסף, נצטרך לעשות סקירה קצרה של שרתי יישומים , שלדעתי ראויים לתשומת לבנו.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION