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...
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 :- 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.
- 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.
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 :- Décrire l'interface de notre service web
- Implémenter cette interface
- Lancez notre service web
- Écrivez un client et appelez à distance la méthode de service Web souhaitée
main
et 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 interfaceHelloWebService
:
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 WebService
et WebMethod
ne 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 SOAPBinding
s'agit d'une annotation avec des paramètres. Dans ce cas, un paramètre est utilisé style
avec 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 HelloWebServicePublisher
avec 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 packageru.javarush.client
, et dedans une classe HelloWebServiceClient
avec 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.
GO TO FULL VERSION