JavaRush /Blog Java /Random-ES /Servicios web. Paso 2. ¿Cómo simplificar la redacción de ...
eGarmin
Nivel 41

Servicios web. Paso 2. ¿Cómo simplificar la redacción de un cliente?

Publicado en el grupo Random-ES
En esta nota rápida, me gustaría revisar el código del cliente de servicio web que escribimos en el paso anterior . En este caso, asumiré que tienes IDEA abierta y en ella el proyecto del Paso 1. Nuestro servicio web debería iniciarse en este proyecto:
package ru.javarush.client;

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

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
Observe cuánto necesitamos saber de antemano. Además de que necesitas acceso a la descripción wsdl (sin esto, lo siento, no hay manera):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
necesita abrir este archivo xml usted mismo y mirar la etiqueta definitions, y en ella los atributos targetNamespacey namellamar al constructor QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
entonces necesitas conectarte manualmente a la etiqueta service:
Service service = Service.create(url, qname);
y en él a la etiqueta port:
HelloWebService hello = service.getPort(HelloWebService.class);
y solo después de eso podemos llamar al método remoto:
hello.getHelloString("JavaRush")
La pregunta es: ¿es por eso que nuestros bisabuelos murieron en los campos de batalla, para que ahora lo hagamos todo a mano? Y si ni siquiera es nuestro servicio web, sino el de otra persona. Entonces este proceso será aún más desagradable. El formato XML está diseñado para ser leído por máquinas, no por humanos. Así que dejemos que la máquina haga el trabajo sucio y disfrutemos el proceso. Para ello no necesitamos hacer nada especial, porque... Nuestro SDK favorito, llamado JDK en Java, incluye una utilidad especial llamada wsimport . Pero lo primero es lo primero... Primero, creemos un nuevo proyecto en IDEA seleccionando Archivo > Nuevo proyecto... en el menú y dándole al proyecto el nombre HelloWS . Cuando se nos pregunta dónde abrir el proyecto recién creado, debemos responder Nueva ventana , es decir en una nueva ventana, porque notaré una vez más que es muy importante que el proyecto anterior esté abierto, porque Recordamos del Paso 1 que tenemos nuestro servicio web ejecutándose en ese proyecto. Por supuesto, puedes simplemente ejecutarlo a través de la consola de Windows, pero no me gusta hacerlo. Desde el nuevo proyecto, abra la consola seleccionando Ver > Ventanas de herramientas > Terminal , o simplemente presionando Alt+F12 . Ahora estamos en la raíz del proyecto y necesitamos ingresar a la carpeta src , por lo que ingresamos el siguiente comando en la consola: cd src Ahora es el momento de usar la utilidad wsimport . Funciona según el siguiente principio: le pasamos una descripción WSDL y, en respuesta, crea archivos stub (llamados Stubclases), que ya contienen toda la funcionalidad que necesitamos para acceder al servicio web. Estas clases se colocarán en el paquete ru.javarush.ws. Si pregunta de dónde viene el nombre del paquete, la respuesta es: el nombre del paquete es el espacio de nombres de destino invertido de la descripción WSDL . Recuerde el atributo targetNamespaceen la etiqueta definitionsdel WSDL . Allí teníamos escrito lo siguiente http:// ws.javarush.ru/. Y esta no es la dirección del sitio, así es como se acostumbra describir los espacios de nombres en xml, y si descartamos http://y expandimos lo que queda en orden inverso, obtendremos el nombre de nuestro paquete. Entonces, ejecutemos la utilidad: wsimport -keep http://localhost:1986/wss/hello?wsdl para que funcione, la ruta debe especificarse en la variable de entorno PATH , o simplemente puede usar la ruta completa. Para mí, se encuentra en la carpeta C:\Program Files\Java\jdk1.8.0_31\bin . Tenga en cuenta que todo lo que necesita hacer es pasar el archivo WSDL a través de la clave –keep , que está disponible de forma remota a través de un enlace, a menos, por supuesto, que hayamos desactivado el servicio web. ¿Cuáles son estas clases de resguardo? Sólo hay dos de ellos. Uno de ellos esHelloWebService, que es esencialmente la misma interfaz de servicio web que creamos manualmente en el Paso 1. La diferencia es mínima y radica en el hecho de que las anotaciones que ya hemos encontrado se usan de manera ligeramente diferente y, además, se usan anotaciones adicionales, que Mencioné que no sé nada, pero como todo funcionó para nosotros antes sin ellos, obviamente no son obligatorios. La segunda clase es stub HelloWebServiceImplService, que hereda de la clase Service. Ya hemos encontrado la clase Serviceen nuestro cliente. No daré el código de esta clase, porque... No estoy listo para explicar todas sus líneas, pero la esencia de la clase se reduce al hecho de que todo lo que previamente escribimos manualmente en el cliente para conectarnos al servicio web se crea automáticamente en esta clase y solo necesitamos llama a uno de sus métodos y tendremos todo calado. Entonces, reescribamos el código de nuestro cliente en un nuevo proyecto usando estas clases y asegurémonos de que el código sea más conciso. Primero, en la carpeta src del nuevo proyecto, creemos un paquete ru.javarush.clienty en él una clase HelloWebServiceClientcon un método 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") );
    }
}
Analizar el código es elemental y lo que describí en los comentarios es suficiente. Después de iniciar el cliente, deberíamos ver la línea: Hello, JavaRush Community!Al mismo tiempo, el cliente del proyecto del Paso 1 continuará trabajando y mostrará el texto que escribimos en él, a saber: Hello, JavaRush! En este punto, tal vez podamos terminar esto. Paso, porque su objetivo ha sido logrado. Nos dimos cuenta de que si hay una descripción WSDL de un servicio web, entonces jdk está listo para proporcionarnos la generación automática stubde clases stub para simplificar la escritura de un cliente para este servicio web. En mi opinión, esta es una característica muy útil cuando desea probar el servicio web de otra persona y no echar un vistazo a su descripción WSDL . Una mirada al futuro En el próximo artículo sobre servicios web, me gustaría esbozar ideas sobre cómo implementar un servicio web en un contenedor de servlets Tomcat y en diferentes servidores de aplicaciones, de modo que no sea necesario ejecutar el servicio web como un aplicación separada, como lo hicimos en los primeros 2 pasos. Pero antes de eso, creo que sería mejor hacer una breve digresión sobre el tema de qué son los servlets, los contenedores de servlets y en qué se diferencian de los servidores de aplicaciones y la web normal... . Además, tendremos que hacer un breve repaso a los servidores de aplicaciones , que, en mi opinión, merecen nuestra atención.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION