JavaRush /Blog Java /Random-FR /Services Web. Étape 1. Qu'est-ce qu'un service Web et com...
eGarmin
Niveau 41

Services Web. Étape 1. Qu'est-ce qu'un service Web et comment l'utiliser ?

Publié dans le groupe Random-FR
Le titre du sujet est vraiment une question, parce que... Je ne sais pas moi-même ce que c'est et pour la première fois je vais essayer de travailler avec dans le cadre de cet article. La seule chose que je peux garantir, c'est que le code présenté ci-dessous fonctionnera, mais mes phrases ne seront que des hypothèses et des suppositions sur la façon dont je comprends moi-même tout cela. Alors allons-y... Services Web.  Étape 1. Qu'est-ce qu'un service Web et comment l'utiliser ?  - 1

Introduction

Nous devons commencer par pourquoi le concept de services Web a été créé. Au moment où ce concept est apparu dans le monde, il existait déjà des technologies permettant aux applications d'interagir à distance, où un programme pouvait appeler une méthode dans un autre programme, qui pouvait être lancée sur un ordinateur situé dans une autre ville ou même un autre pays. Tout cela est abrégé en RPC (Remote Procedure Calling). Les exemples incluent les technologies CORBA et pour Java - RMI (Remote Method Invoking). Et tout semble aller bien chez eux, surtout à CORBA, parce que... Vous pouvez travailler avec n'importe quel langage de programmation, mais il manquait encore quelque chose. Je pense que l'inconvénient de CORBA est qu'il fonctionne via certains de ses propres protocoles réseau au lieu du simple HTTP, qui passe à travers n'importe quel pare-feu. L'idée du service Web était de créer un RPC qui serait inséré dans les paquets HTTP. Ainsi commença le développement de la norme. Quels sont les concepts de base de cette norme :
  1. SAVON . Avant d'appeler une procédure distante, vous devez décrire cet appel dans un fichier XML au format SOAP. SOAP est simplement l'un des nombreux balises XML utilisées dans les services Web. Tout ce que nous voulons envoyer quelque part via HTTP est d'abord converti en une description XML SOAP, puis inséré dans un paquet HTTP et envoyé à un autre ordinateur du réseau via TCP/IP.
  2. WSDL . Il existe un service Web, c'est-à-dire un programme dont les méthodes peuvent être appelées à distance. Mais la norme exige que ce programme soit accompagné d'une description indiquant que "oui, vous avez raison, il s'agit en réalité d'un service Web et vous pouvez appeler telle ou telle méthode à partir de celui-ci". Cette description est représentée par un autre fichier XML, qui a un format différent, à savoir WSDL. Ceux. WSDL n'est qu'un fichier XML décrivant un service Web et rien de plus.
Pourquoi demandez-vous si brièvement ? Tu ne peux pas être plus précis ? C’est probablement possible, mais pour ce faire, vous devrez vous tourner vers des livres tels que T. Mashnin, « Java Web Services ». Là, sur les 200 premières pages, on trouve une description détaillée de chaque balise des standards SOAP et WSDL. Est-ce que ça vaut la peine de le faire ? A mon avis non, parce que... tout cela est créé automatiquement en Java, et il vous suffit d'écrire le contenu des méthodes censées être appelées à distance. Ainsi, une API telle que JAX-RPC est apparue en Java. Si quelqu'un ne le sait pas, quand on dit que Java a telle ou telle API, cela signifie qu'il existe un package avec un ensemble de classes qui encapsulent la technologie en question. JAX-RPC a évolué au fil du temps de version en version et est finalement devenu JAX-WS. WS signifie évidemment WebService et vous pourriez penser qu'il s'agit simplement d'un changement de nom de RPC en tant que mot à la mode populaire de nos jours. Ce n'est pas vrai, parce que Désormais, les services Web se sont éloignés de l'idée originale et vous permettent non seulement d'appeler des méthodes distantes, mais également d'envoyer simplement des messages de documents au format SOAP. Je ne sais pas encore pourquoi cela est nécessaire ; il est peu probable que la réponse ici soit « juste au cas où cela serait nécessaire ». J'aimerais moi-même apprendre de camarades plus expérimentés. Et enfin, JAX-RS est apparu pour les services Web dits RESTful, mais cela fait l'objet d'un article séparé. L'introduction peut s'arrêter ici, car... Nous apprendrons ensuite à travailler avec JAX-WS.

Approche générale

Dans les services Web, il y a toujours un client et un serveur. Le serveur est notre service Web et est parfois appelé le point de terminaison (comme dans le point de terminaison auquel parviennent les messages SOAP du client). Nous devons faire ce qui suit :
  1. Décrire l'interface de notre service web
  2. Implémenter cette interface
  3. Lancez notre service web
  4. Écrivez un client et appelez à distance la méthode de service Web souhaitée
Vous pouvez lancer un service web de différentes manières : soit décrire une classe avec une méthode mainet lancer le service web directement en tant que serveur, soit le déployer sur un serveur comme Tomcat ou tout autre. Dans le second cas, nous ne lançons pas nous-mêmes un nouveau serveur et n'ouvrons pas un autre port sur l'ordinateur, mais disons simplement au conteneur de servlet Tomcat que « nous avons écrit ici des classes de service Web, veuillez les publier afin que tous ceux qui vous contactent puissent utilisez notre service Web." Quelle que soit la méthode de lancement du service web, nous aurons le même client.

Serveur

Lançons IDEA et créons un nouveau projet Create New Project . Précisez le nom HelloWebService et cliquez sur le bouton Suivant , puis sur le bouton Terminer . Dans le dossier src , nous allons créer le package ru.javarush.ws . Dans ce package nous allons créer une interface HelloWebService:
package ru.javarush.ws;

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

// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
    // говорим, что этот метод можно вызывать удаленно
    @WebMethod
    public String getHelloString(String name);
}
Dans ce code, les classes sont ce qu'on appelle des annotations WebServiceet WebMethodne font rien d'autre que marquer notre interface et sa méthode comme un service Web. La même chose s'applique à la classe SOAPBinding. La seule différence est qu'il SOAPBindings'agit d'une annotation avec des paramètres. Dans ce cas, un paramètre est utilisé styleavec une valeur indiquant que le service Web ne fonctionnera pas via des messages de document, mais comme un RPC classique, c'est-à-dire pour appeler une méthode. Implémentons notre logique d'interface et créons une classe dans notre package HelloWebServiceImpl. À propos, je note que terminer une classe par Impl est une convention en Java selon laquelle l'implémentation des interfaces est ainsi désignée (Impl - du mot implémentation, c'est-à-dire implémentation). Ce n'est pas une exigence et vous êtes libre de nommer la classe comme vous le souhaitez, mais les bonnes manières l'exigent :
package ru.javarush.ws;

// таже annotation, что и при описании интерфейса,
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 + "!";
    }
}
Lançons notre service Web en tant que serveur indépendant, c'est-à-dire sans la participation de Tomcat et des serveurs d'applications (il s'agit d'un sujet pour une discussion distincte). Pour ce faire, dans la structure du projet dans le dossier src , nous allons créer un package ru.javarush.endpoint, et dans celui-ci nous allons créer une classe HelloWebServicePublisheravec une méthode 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
        // и по addressу, указанному в первом аргументе,
        // запускаем веб-сервис, передаваемый во втором аргументе
        Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
    }
}
Exécutons maintenant cette classe en appuyant sur Shift+F10 . Rien n'apparaîtra dans la console, mais le serveur est en cours d'exécution. Vous pouvez le vérifier en tapant la ligne http://localhost:1986/wss/hello?wsdl dans votre navigateur . La page qui s'ouvre, d'une part, prouve que nous avons un serveur Web (http://) fonctionnant sur le port 1986 sur notre ordinateur (localhost), et, d'autre part, montre une description WSDL de notre service Web. Si vous arrêtez l'application, la description deviendra indisponible, tout comme le service Web lui-même, nous ne le ferons donc pas, mais passons à l'écriture du client.

Client

Dans le dossier du projet src nous allons créer un package ru.javarush.client, et dedans une classe HelloWebServiceClientavec une méthode main:
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"));
    }
}
J'ai donné un maximum de commentaires sur le code dans le listing. Je n'ai rien à ajouter, alors courons (Maj+F10). Nous devrions voir le texte dans la console : Hello, JavaRush!Si vous ne l'avez pas vu, c'est que vous avez probablement oublié de démarrer le service Web.

Conclusion

Ce sujet a fourni une brève excursion dans les services Web. Encore une fois, je dirai qu'une grande partie de ce que j'ai écrit n'est que ma supposition quant à la façon dont cela fonctionne, et par conséquent, vous ne devriez pas trop me faire confiance. Je serais reconnaissant si des personnes bien informées me corrigeaient, car j'apprendrais alors quelque chose. MISE À JOUR. Continuons la conversation
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION