JavaRush /Blog Java /Random-FR /Services Web. Étape 2. Comment simplifier la rédaction d'...
eGarmin
Niveau 41

Services Web. Étape 2. Comment simplifier la rédaction d'un client ?

Publié dans le groupe Random-FR
Sur cette note rapide, j'aimerais revoir le code client du service Web que nous avons écrit à l' étape précédente . Dans ce cas, je suppose que vous avez IDEA ouvert, et qu'il contient le projet de l'étape 1. Notre service Web devrait être lancé dans ce projet :
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"));
    }
}
Remarquez combien nous avons besoin de savoir à l’avance. En plus du fait que vous devez accéder à la description wsdl (sans cela, désolé, il n'y a aucun moyen) :
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
vous devez ouvrir ce fichier XML vous-même et regarder la balise definitions, ainsi que les attributs targetNamespaceet nameappeler le constructeurQName :
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
alors vous devez vous connecter manuellement au tag service:
Service service = Service.create(url, qname);
et dedans à la baliseport :
HelloWebService hello = service.getPort(HelloWebService.class);
et seulement après cela, nous pouvons appeler la méthode distante :
hello.getHelloString("JavaRush")
La question est : est-ce pour cela que nos arrière-grands-pères sont morts sur les champs de bataille, de sorte que nous faisons désormais tout à la main ? Et s’il ne s’agit même pas de notre service Web, mais de celui de quelqu’un d’autre. Ce processus sera alors encore plus désagréable. Le format XML est conçu pour être lu par des machines et non par des humains. Alors laissons la machine faire le sale boulot et apprécions le processus. Pour cela, nous n’avons rien de spécial à faire, car... Notre SDK préféré, appelé JDK en Java, comprend un utilitaire spécial appelé wsimport . Mais tout d'abord... Tout d'abord, créons un nouveau projet dans IDEA en sélectionnant Fichier > Nouveau projet... dans le menu et en donnant au projet le nom HelloWS . Lorsqu'on nous demande où ouvrir le projet nouvellement créé, nous devons répondre Nouvelle fenêtre , c'est-à-dire dans une nouvelle fenêtre, car je précise encore une fois qu'il est très important que le projet précédent soit ouvert, car Nous nous souvenons de l'étape 1 que notre service Web s'exécute dans ce projet. Vous pouvez bien sûr simplement le lancer via la console Windows, mais je n’aime pas faire ça. À partir du nouveau projet, ouvrez la console en sélectionnant Affichage > Fenêtres d'outils > Terminal ou en appuyant simplement sur Alt+F12 . Nous sommes maintenant à la racine du projet et nous devons accéder au dossier src . Nous entrons donc la commande suivante dans la console : cd src Il est maintenant temps d'utiliser l' utilitaire wsimport . Il fonctionne sur le principe suivant : nous lui transmettons une description WSDL et, en réponse, il crée des fichiers stub (appelés Stub-classes), qui contiennent déjà toutes les fonctionnalités dont nous avons besoin pour accéder au service Web. Ces classes seront placées dans le package ru.javarush.ws. Si vous demandez d'où vient le nom du package, la réponse est : le nom du package est l'espace de noms cible inversé de la description WSDL . N'oubliez pas l'attribut targetNamespacedans la balise definitionsdu WSDL . Là, nous avions écrit ce qui suit http:// ws.javarush.ru/. Et ce n'est pas l'adresse du site, c'est ainsi qu'il est habituel de décrire les espaces de noms en XML, et si nous supprimons http://et développons ce qui reste dans l'ordre inverse, nous obtiendrons le nom de notre package. Alors, exécutons l'utilitaire : wsimport -keep http://localhost:1986/wss/hello?wsdl pour qu'il fonctionne, le chemin d'accès doit être spécifié dans la variable d'environnement PATH , ou vous pouvez simplement utiliser le chemin complet d'accès. Pour moi, il se trouve dans le dossier C:\Program Files\Java\jdk1.8.0_31\bin . Attention, il suffit de transmettre le fichier WSDL via la touche –keep , accessible à distance via un lien, à moins bien sûr que nous ayons désactivé le service web. Quelles sont ces classes de stub ? Il n'y en a que deux. L'un d'eux estHelloWebService, qui est essentiellement la même interface de service Web que nous avons créée manuellement à l'étape 1. La différence est minime et réside dans le fait que les annotations que nous avons déjà rencontrées sont utilisées légèrement différemment, et en plus, des annotations supplémentaires sont utilisées, ce qui J'ai mentionné que je ne savais rien, mais comme tout fonctionnait pour nous sans eux auparavant, ils ne sont évidemment pas obligatoires. La deuxième classe est stub HelloWebServiceImplService, qui hérite de la classe Service. Nous avons déjà rencontré la classe Servicechez notre client. Je ne donnerai pas le code de cette classe, car... Je suis à peine prêt à expliquer toutes ses lignes, mais l'essence de la classe se résume au fait que tout ce que nous avons précédemment écrit manuellement dans le client pour nous connecter au service Web est créé automatiquement dans cette classe et il nous suffit de appelez une de ses méthodes et nous aurons tout en open-up. Réécrivons donc le code de notre client dans un nouveau projet en utilisant ces classes et assurons-nous que le code est plus concis. Tout d'abord, dans le dossier src du nouveau projet, créons un package ru.javarush.client, et dedans une classe HelloWebServiceClientavec une méthode 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") );
    }
}
L'analyse du code est élémentaire et ce que j'ai décrit dans les commentaires est largement suffisant. Après avoir lancé le client, nous devrions voir la ligne : Hello, JavaRush Community!En même temps, le client du projet de l'étape 1 continuera à travailler et affichera le texte que nous y avons écrit, à savoir : Hello, JavaRush! À ce stade, peut-être pouvons-nous terminer ceci Étape, parce que son objectif a été atteint. Nous avons réalisé que s'il existe une description WSDL d'un service Web, alors jdk est prêt à nous fournir une génération automatique stubde classes stub pour simplifier l'écriture d'un client pour ce service Web. À mon avis, il s’agit d’une fonctionnalité très utile lorsque vous souhaitez tester le service Web de quelqu’un d’autre sans jeter un coup d’œil à sa description WSDL . Un regard vers l'avenir Dans le prochain article sur les services Web, j'aimerais présenter des idées sur la manière de déployer un service Web dans un conteneur de servlet Tomcat et dans différents serveurs d'applications, afin que vous n'ayez pas besoin d'exécuter le service Web en tant que serveur d'applications. application distincte, comme nous l’avons fait dans les 2 premières étapes. Mais avant cela, je pense qu'il serait préférable de faire une brève digression sur ce que sont les servlets, les conteneurs de servlets et en quoi ils diffèrent des serveurs d'applications et du Web classique... . De plus, nous devrons faire un bref aperçu des serveurs d'applications , qui, à mon avis, méritent notre attention.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION