JavaRush /Java-Blog /Random-DE /Internetdienste. Schritt 1. Was ist ein Webdienst und wie...
eGarmin
Level 41

Internetdienste. Schritt 1. Was ist ein Webdienst und wie arbeitet man damit?

Veröffentlicht in der Gruppe Random-DE
Der Thementitel ist wirklich eine Frage, denn... Ich selbst weiß nicht, was es ist und werde im Rahmen dieses Artikels zum ersten Mal versuchen, damit zu arbeiten. Das Einzige, was ich garantieren kann, ist, dass der unten dargestellte Code funktioniert, aber meine Formulierungen werden nur Annahmen und Vermutungen darüber sein, wie ich selbst das alles verstehe. So lass uns gehen... Internetdienste.  Schritt 1. Was ist ein Webdienst und wie arbeitet man damit?  - 1

Einführung

Wir müssen damit beginnen, warum das Konzept der Webdienste geschaffen wurde. Als dieses Konzept auf der Welt erschien, gab es bereits Technologien, die es Anwendungen ermöglichten, aus der Ferne zu interagieren, wobei ein Programm eine Methode in einem anderen Programm aufrufen konnte, die auf einem Computer in einer anderen Stadt oder sogar einem anderen Land gestartet werden konnte. All dies wird als RPC (Remote Procedure Calling) abgekürzt. Beispiele hierfür sind CORBA-Technologien und für Java RMI (Remote Method Invoking). Und bei ihnen scheint alles gut zu sein, besonders bei CORBA, denn... Man kann damit in jeder Programmiersprache arbeiten, aber es fehlte noch etwas. Ich glaube, dass der Nachteil von CORBA darin besteht, dass es über einige seiner eigenen Netzwerkprotokolle funktioniert und nicht über einfaches HTTP, das durch jede Firewall passt. Die Idee des Webdienstes bestand darin, einen RPC zu erstellen, der in HTTP-Pakete eingefügt wird. Damit begann die Entwicklung des Standards. Was sind die Grundkonzepte dieser Norm:
  1. SEIFE . Bevor Sie eine Remote-Prozedur aufrufen, müssen Sie diesen Aufruf in einer XML-Datei im SOAP-Format beschreiben. SOAP ist einfach eines der vielen XML-Markups, die in Webdiensten verwendet werden. Alles, was wir über HTTP irgendwohin senden möchten, wird zunächst in eine XML-SOAP-Beschreibung umgewandelt, dann in ein HTTP-Paket gestopft und über TCP/IP an einen anderen Computer im Netzwerk gesendet.
  2. WSDL . Es gibt einen Webservice, d.h. ein Programm, dessen Methoden remote aufgerufen werden können. Der Standard verlangt jedoch, dass diesem Programm eine Beschreibung beigefügt wird, die besagt: „Ja, Sie haben Recht – das ist wirklich ein Webdienst, und Sie können von dort aus die eine oder andere Methode aufrufen.“ Diese Beschreibung wird durch eine andere XML-Datei dargestellt, die ein anderes Format hat, nämlich WSDL. Diese. WSDL ist nur eine XML-Datei, die einen Webdienst beschreibt, mehr nicht.
Warum fragst du so kurz? Können Sie nicht genauer sein? Es ist wahrscheinlich möglich, aber dazu müssen Sie auf Bücher wie „Java Web Services“ von T. Mashnin zurückgreifen. Dort finden Sie auf den ersten 200 Seiten eine detaillierte Beschreibung jedes Tags der SOAP- und WSDL-Standards. Lohnt es sich? Meiner Meinung nach nein, denn... All dies wird in Java automatisch erstellt, und Sie müssen nur die Inhalte der Methoden schreiben, die remote aufgerufen werden sollen. Daher erschien in Java eine API wie JAX-RPC. Wenn jemand es nicht weiß: Wenn er sagt, dass Java diese und jene API hat, bedeutet das, dass es ein Paket mit einer Reihe von Klassen gibt, die die betreffende Technologie kapseln. JAX-RPC entwickelte sich im Laufe der Zeit von Version zu Version weiter und wurde schließlich zu JAX-WS. WS steht offensichtlich für WebService und man könnte denken, dass dies einfach eine Umbenennung von RPC ist, einem heutzutage beliebten Schlagwort. Das stimmt nicht, denn Jetzt haben sich Webdienste von der ursprünglichen Idee entfernt und ermöglichen nicht nur den Aufruf von Remote-Methoden, sondern auch das einfache Senden von Dokumentnachrichten im SOAP-Format. Ich weiß noch nicht, warum das nötig ist; es ist unwahrscheinlich, dass die Antwort hier „nur für den Fall, dass es nötig ist“ lautet. Ich selbst würde gerne von erfahreneren Kameraden lernen. Und schließlich erschien JAX-RS für sogenannte RESTful-Webdienste, aber das ist Thema eines separaten Artikels. Die Einleitung kann hier enden, denn... Als nächstes lernen wir, mit JAX-WS zu arbeiten.

Allgemeiner Ansatz

Bei Webdiensten gibt es immer einen Client und einen Server. Der Server ist unser Webdienst und wird manchmal als Endpunkt bezeichnet (z. B. als Endpunkt, an dem SOAP-Nachrichten vom Client ankommen). Wir müssen Folgendes tun:
  1. Beschreiben Sie die Oberfläche unseres Webservices
  2. Implementieren Sie diese Schnittstelle
  3. Starten Sie unseren Webservice
  4. Schreiben Sie einen Client und rufen Sie die gewünschte Webdienstmethode aus der Ferne auf
Sie können einen Webdienst auf unterschiedliche Weise starten: Beschreiben Sie entweder eine Klasse mit einer Methode mainund starten Sie den Webdienst direkt als Server oder stellen Sie ihn auf einem Server wie Tomcat oder einem anderen bereit. Im zweiten Fall starten wir selbst keinen neuen Server und öffnen keinen weiteren Port auf dem Computer, sondern teilen dem Tomcat-Servlet-Container einfach mit, dass „wir hier Webdienstklassen geschrieben haben. Bitte veröffentlichen Sie sie, damit jeder, der Sie kontaktiert, dies tun kann.“ Nutzen Sie unseren Webservice. Unabhängig von der Methode zum Starten des Webdienstes haben wir denselben Client.

Server

Lassen Sie uns IDEA starten und ein neues Projekt erstellen. Neues Projekt erstellen . Geben Sie den Namen HelloWebService an und klicken Sie auf die Schaltfläche „ Weiter “ und dann auf die Schaltfläche „Fertig stellen“ . Im Ordner src erstellen wir das Paket ru.javarush.ws . In diesem Paket erstellen wir eine Schnittstelle HelloWebService:
package ru.javarush.ws;

// это аннотации, т.е. способ отметить наши классы и методы,
// Wie связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

// говорим, что наш интерфейс будет работать Wie веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
    // говорим, что этот метод можно вызывать удаленно
    @WebMethod
    public String getHelloString(String name);
}
In diesem Code sind die Klassen sogenannte Annotationen WebServiceund WebMethodmachen nichts anderes, als unsere Schnittstelle und ihre Methode als Webservice zu markieren. Dasselbe gilt auch für die Klasse SOAPBinding. Der einzige Unterschied besteht darin, dass SOAPBindinges sich um eine Annotation mit Parametern handelt. In diesem Fall wird ein Parameter mit einem Wert verwendet, styleder angibt, dass der Webdienst nicht über Dokumentnachrichten, sondern als klassischer RPC, d. h. eine Methode aufrufen. Lassen Sie uns unsere Schnittstellenlogik implementieren und eine Klasse in unserem Paket erstellen HelloWebServiceImpl. Ich stelle übrigens fest, dass das Beenden einer Klasse mit „Impl“ eine Konvention in Java ist, nach der die Implementierung von Schnittstellen so bezeichnet wird (Impl – vom Wort „Implementierung“, d. h. „Implementierung“). Dies ist keine Voraussetzung und es steht Ihnen frei, der Klasse einen beliebigen Namen zu geben, aber gute Manieren erfordern es:
package ru.javarush.ws;

// таже Anmerkung, что и при описании интерфейса,
import javax.jws.WebService;

// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
    @Override
    public String getHelloString(String name) {
        // просто возвращаем приветствие
        return "Hello, " + name + "!";
    }
}
Lassen Sie uns unseren Webdienst als unabhängigen Server starten, d. h. ohne die Beteiligung von Tomcat und Anwendungsservern (dies ist ein Thema für eine separate Diskussion). Dazu erstellen wir in der Projektstruktur im Ordner srcru.javarush.endpoint ein Paket und darin eine Klasse HelloWebServicePublishermit einer Methode main:
package ru.javarush.endpoint;

// класс, для запуска веб-Serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;

public class HelloWebServicePublisher {
    public static void main(String... args) {
        // запускаем веб-Server на порту 1986
        // и по Adresseу, указанному в первом аргументе,
        // запускаем веб-сервис, передаваемый во втором аргументе
        Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
    }
}
Lassen Sie uns nun diese Klasse ausführen, indem wir Umschalt+F10 drücken . In der Konsole wird nichts angezeigt, aber der Server läuft. Sie können dies überprüfen, indem Sie die Zeile http://localhost:1986/wss/hello?wsdl in Ihren Browser eingeben . Die Seite, die sich öffnet, beweist einerseits, dass auf unserem Computer (localhost) ein Webserver (http://) auf Port 1986 läuft, und zeigt andererseits eine WSDL-Beschreibung unseres Webservices. Wenn Sie die Anwendung stoppen, ist die Beschreibung nicht mehr verfügbar, ebenso wie der Webdienst selbst. Daher werden wir dies nicht tun, sondern mit dem Schreiben des Clients fortfahren.

Klient

Im Projektordner src erstellen wir ein Paket ru.javarush.clientund darin eine Klasse HelloWebServiceClientmit einer Methode main:
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"));
    }
}
Ich habe den Code in der Auflistung maximal kommentiert. Ich habe nichts hinzuzufügen, also lasst uns loslegen (Umschalt+F10). Wir sollten den Text in der Konsole sehen: Hello, JavaRush!Wenn Sie ihn nicht gesehen haben, haben Sie wahrscheinlich vergessen, den Webdienst zu starten.

Abschluss

Dieses Thema bot einen kurzen Ausflug in Webdienste. Ich möchte noch einmal sagen, dass vieles von dem, was ich geschrieben habe, meine Vermutungen darüber sind, wie es funktioniert, und dass Sie mir daher nicht zu sehr vertrauen sollten. Ich wäre dankbar, wenn sachkundige Leute mich korrigieren würden, denn dann werde ich etwas lernen. UPD. Lassen Sie uns das Gespräch fortsetzen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION