JavaRush /Java-Blog /Random-DE /Internetdienste. Schritt 2. Wie vereinfacht man das Schre...
eGarmin
Level 41

Internetdienste. Schritt 2. Wie vereinfacht man das Schreiben eines Kunden?

Veröffentlicht in der Gruppe Random-DE
In dieser kurzen Anmerkung möchte ich noch einmal auf den Webdienst-Client-Code zurückgreifen, den wir im vorherigen Schritt geschrieben haben . In diesem Fall gehe ich davon aus, dass Sie IDEA geöffnet haben und darin das Projekt aus Schritt 1. Unser Webdienst sollte in diesem Projekt gestartet werden:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с ein Objektом 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, чтобы
        // получить ссылку на удаленный от нас ein Objekt веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
Beachten Sie, wie viel wir im Voraus wissen müssen. Zusätzlich zu der Tatsache, dass Sie Zugriff auf die WSDL- Beschreibung benötigen (ohne diese gibt es leider keine Möglichkeit):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
Sie müssen diese XML-Datei selbst öffnen, sich das Tag definitionsund die darin enthaltenen Attribute ansehen targetNamespaceund nameden Konstruktor aufrufen QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
Dann müssen Sie manuell eine Verbindung zum Tag herstellen service:
Service service = Service.create(url, qname);
und darin zum Tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
und erst danach können wir die Remote-Methode aufrufen:
hello.getHelloString("JavaRush")
Die Frage ist: Sind unsere Urgroßväter deshalb auf den Schlachtfeldern gestorben, sodass wir jetzt alles von Hand erledigen? Und wenn es nicht einmal unser Webservice ist, sondern der von jemand anderem. Dann wird dieser Vorgang noch unangenehmer. Das XML-Format ist so konzipiert, dass es von Maschinen und nicht von Menschen gelesen werden kann. Überlassen wir also die Maschine die Drecksarbeit und genießen Sie den Vorgang. Dafür müssen wir nichts Besonderes tun, denn... Unser Lieblings-SDK, in Java JDK genannt, enthält ein spezielles Dienstprogramm namens wsimport . Aber das Wichtigste zuerst... Erstellen wir zunächst ein neues Projekt in IDEA, indem wir im Menü Datei > Neues Projekt... auswählen und dem Projekt den Namen HelloWS geben . Wenn wir gefragt werden, wo wir das neu erstellte Projekt öffnen sollen, müssen wir mit „Neues Fenster“ antworten , d. h. in einem neuen Fenster, denn ich weise noch einmal darauf hin, dass es sehr wichtig ist, dass das vorherige Projekt geöffnet ist, denn Wir erinnern uns an Schritt 1, dass unser Webdienst in diesem Projekt ausgeführt wird. Sie können es natürlich auch einfach über die Windows-Konsole starten, aber das gefällt mir nicht. Öffnen Sie im neuen Projekt die Konsole, indem Sie View > Tool Windows > Terminal auswählen oder einfach Alt+F12 drücken . Jetzt sind wir im Stammverzeichnis des Projekts und müssen in den Ordner src gelangen , also geben wir den folgenden Befehl in die Konsole ein: Jetzt ist es an der Zeit, das Dienstprogramm wsimportcd src zu verwenden . Es funktioniert nach folgendem Prinzip: Wir übergeben ihm eine WSDL- Beschreibung und als Antwort erstellt es Stub-Dateien (sogenannte -Klassen), die bereits alle Funktionen enthalten, die wir für den Zugriff auf den Webdienst benötigen. Diese Klassen werden in das Paket eingefügt . Wenn Sie fragen, woher der Paketname kommt, lautet die Antwort: Der Paketname ist der umgekehrte Zielnamensraum aus der WSDL- Beschreibung. Merken Sie sich das Attribut im Tag aus der WSDL . Da hatten wir folgendes geschrieben . Und dies ist nicht die Site-Adresse, sondern die übliche Beschreibung von Namespaces in XML. Wenn wir den Rest in umgekehrter Reihenfolge verwerfen und erweitern, erhalten wir unseren Paketnamen. Lassen Sie uns also das Dienstprogramm ausführen: Damit es funktioniert, muss der Pfad dazu in der Umgebungsvariablen PATH angegeben werden , oder Sie können einfach den vollständigen Pfad dazu verwenden. Bei mir liegt es im Ordner C:\Program Files\Java\jdk1.8.0_31\bin . Bitte beachten Sie, dass Sie lediglich die WSDL- Datei über den Schlüssel –keep übergeben müssen, der remote über einen Link verfügbar ist, es sei denn, wir haben den Webdienst natürlich deaktiviert. Was sind diese Stub-Klassen? Es gibt nur zwei davon. Einer von ihnen istStubru.javarush.wstargetNamespacedefinitionshttp:// ws.javarush.ru/http://wsimport -keep http://localhost:1986/wss/hello?wsdlHelloWebServiceDabei handelt es sich im Wesentlichen um die gleiche Webservice-Schnittstelle, die wir in Schritt 1 manuell erstellt haben. Der Unterschied ist minimal und liegt darin, dass die Annotationen, auf die wir bereits gestoßen sind, etwas anders verwendet werden und darüber hinaus zusätzliche Annotationen verwendet werden, die Ich habe erwähnt, dass ich nichts weiß, aber da bei uns vorher alles ohne sie funktioniert hat, sind sie natürlich nicht obligatorisch. Die zweite Klasse ist Stub HelloWebServiceImplService, die von der Klasse erbt Service. Wir sind der Klasse bereits Servicein unserem Client begegnet. Ich werde den Code dieser Klasse nicht angeben, weil ... Ich bin kaum bereit, alle Zeilen zu erklären, aber das Wesentliche der Klasse besteht darin, dass alles, was wir zuvor manuell im Client geschrieben haben, um eine Verbindung zum Webdienst herzustellen, in dieser Klasse automatisch erstellt wird und wir es nur tun müssen Rufen Sie eine seiner Methoden auf und wir haben alles in Openwork. Schreiben wir also unseren Client-Code in einem neuen Projekt mit diesen Klassen um und stellen wir sicher, dass der Code prägnanter ist. Erstellen wir zunächst im src-ru.javarush.client Ordner des neuen Projekts ein Paket und darin eine Klasse HelloWebServiceClientmit einer Methode 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") );
    }
}
Das Parsen des Codes ist elementar und das, was ich in den Kommentaren beschrieben habe, reicht vollkommen aus. Nachdem wir den Client gestartet haben, sollten wir die Zeile sehen: Hello, JavaRush Community!Gleichzeitig wird der Client aus dem Projekt aus Schritt 1 weiterarbeiten und seinen Text anzeigen, den wir darin geschrieben haben, nämlich: Hello, JavaRush! An diesem Punkt können wir das vielleicht beenden Schritt, weil sein Ziel ist erreicht. Wir haben festgestellt, dass, wenn es eine WSDL- Beschreibung eines Webdienstes gibt, JDK bereit ist, uns die automatische Generierung von Stub-Klassen bereitzustellen stub, um das Schreiben eines Clients für diesen Webdienst zu vereinfachen. Meiner Meinung nach ist dies eine sehr nützliche Funktion, wenn Sie den Webdienst einer anderen Person testen und nicht einen Blick in die WSDL- Beschreibung werfen möchten. Ein Blick in die Zukunft Im nächsten Artikel über Webdienste möchte ich Ideen skizzieren, wie man einen Webdienst in einem Tomcat-Servlet-Container und auf verschiedenen Anwendungsservern bereitstellt, sodass man den Webdienst nicht als ausführen muss separate Bewerbung, wie wir es in den ersten beiden Schritten getan haben. Aber vorher wäre es meiner Meinung nach besser, einen kurzen Exkurs zu dem Thema zu machen, was Servlets, Servlet-Container sind und wie sie sich von Anwendungsservern und regulärem Web unterscheiden ... . Darüber hinaus müssen wir einen kurzen Überblick über Anwendungsserver geben , die meiner Meinung nach unsere Aufmerksamkeit verdienen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION