JavaRush /Blogue Java /Random-PT /Serviços web. Passo 2. Como simplificar a escrita de um c...
eGarmin
Nível 41

Serviços web. Passo 2. Como simplificar a escrita de um cliente?

Publicado no grupo Random-PT
Nesta nota rápida, gostaria de revisitar o código do cliente de serviço da Web que escrevemos na etapa anterior . Neste caso, assumirei que você tem o IDEA aberto, e nele o projeto do Passo 1. Nosso web service deverá ser lançado neste projeto:
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"));
    }
}
Observe o quanto precisamos saber com antecedência. Além de precisar de acesso à descrição do wsdl (sem isso, desculpe, não tem como):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
você mesmo precisa abrir este arquivo xml e olhar a tag definitions, e nela os atributos targetNamespacee namechamar o construtor QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
então você precisa se conectar manualmente à tag service:
Service service = Service.create(url, qname);
e nele para a tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
e só depois disso podemos chamar o método remoto:
hello.getHelloString("JavaRush")
A questão é: foi por isso que os nossos bisavôs morreram nos campos de batalha, de modo que agora fazemos tudo manualmente? E se não for nosso serviço web, mas de outra pessoa. Então esse processo será ainda mais desagradável. O formato XML foi projetado para ser lido por máquinas, não por humanos. Então vamos deixar a máquina fazer o trabalho sujo e aproveitar o processo. Para isso não precisamos fazer nada de especial, pois... Nosso SDK favorito, chamado JDK em Java, inclui um utilitário especial chamado wsimport . Mas comecemos pelo princípio... Primeiro, vamos criar um novo projeto no IDEA selecionando File > New Project... no menu e dando ao projeto o nome HelloWS . Quando nos perguntam onde abrir o projeto recém-criado, precisamos responder New Window , ou seja, em uma nova janela, pois observo mais uma vez que é muito importante que o projeto anterior esteja aberto, pois Lembramos da Etapa 1 que temos nosso serviço web em execução naquele projeto. Você pode, é claro, simplesmente iniciá-lo através do console do Windows, mas não gosto de fazer isso. No novo projeto, abra o console selecionando View > Tool Windows > Terminal ou simplesmente pressionando Alt+F12 . Agora estamos na raiz do projeto e precisamos entrar na pasta src , então inserimos o seguinte comando no console: cd src Agora é hora de usar o utilitário wsimport . Funciona segundo o seguinte princípio: passamos a ele uma descrição WSDL e, em resposta, ele cria arquivos stub (chamados Stub-classes), que já contêm todas as funcionalidades que precisamos para acessar o serviço web. Essas aulas serão colocadas no pacote ru.javarush.ws. Se você perguntar de onde vem o nome do pacote, a resposta é: o nome do pacote é o namespace de destino invertido da descrição WSDL . Lembre-se do atributo targetNamespacena tag definitionsdo WSDL . Lá tivemos o seguinte escrito http:// ws.javarush.ru/. E este não é o endereço do site, é assim que se costuma descrever os namespaces em xml, e se descartarmos http://e expandirmos o que resta na ordem inversa, obteremos o nome do nosso pacote. Então, vamos executar o utilitário: wsimport -keep http://localhost:1986/wss/hello?wsdl Para que funcione, o caminho para ele deve ser especificado na variável de ambiente PATH ou você pode simplesmente usar o caminho completo para ele. Para mim, ele está localizado na pasta C:\Program Files\Java\jdk1.8.0_31\bin . Observe que tudo que você precisa fazer é passar o arquivo WSDL por meio da chave –keep , que está disponível remotamente por meio de um link, a menos, é claro, que tenhamos desabilitado o serviço web. O que são essas classes stub? Existem apenas dois deles. Um deles éHelloWebService, que é essencialmente a mesma interface de serviço web que criamos manualmente na Etapa 1. A diferença é mínima e reside no fato de que as anotações que já encontramos são usadas de forma um pouco diferente e, além disso, são usadas anotações adicionais, que Mencionei que não sei de nada, mas como tudo funcionava para nós antes sem eles, obviamente não são obrigatórios. A segunda classe é stub HelloWebServiceImplService, que herda da classe Service. Já encontramos a classe Serviceem nosso cliente. Não vou dar o código dessa classe, pois... Mal estou pronto para explicar todas as suas linhas, mas a essência da classe se resume ao fato de que tudo o que escrevemos anteriormente no cliente manualmente para conectar ao serviço web é criado automaticamente nesta classe e só precisamos chame um de seus métodos e teremos tudo em openwork. Então, vamos reescrever nosso código cliente em um novo projeto usando essas classes e garantir que o código seja mais conciso. Primeiro, na pasta src do novo projeto, vamos criar um pacote ru.javarush.client, e nele uma classe HelloWebServiceClientcom um 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") );
    }
}
A análise do código é elementar e o que descrevi nos comentários é suficiente. Tendo lançado o cliente, devemos ver a linha: Hello, JavaRush Community!Ao mesmo tempo, o cliente do projeto do Passo 1 continuará trabalhando e exibindo o texto que escrevemos nele, a saber: Hello, JavaRush! Neste ponto, talvez, possamos terminar isso Passo, porque seu objetivo foi alcançado. Percebemos que se houver uma descrição WSDL de um serviço web, então o jdk está pronto para nos fornecer a geração automática stubde classes stub para simplificar a escrita de um cliente para este serviço web. Na minha opinião, este é um recurso muito útil quando você deseja testar o serviço web de outra pessoa e não espiar sua descrição WSDL . Um olhar para o futuro No próximo artigo sobre serviços web, gostaria de delinear ideias sobre como implantar um serviço web em um contêiner de servlet Tomcat e em diferentes servidores de aplicativos, para que você não precise executar o serviço web como um aplicativo separado, como fizemos nas 2 primeiras etapas. Mas antes disso, acho que seria melhor fazer uma breve digressão sobre o que são servlets, contêineres de servlet e como eles diferem dos servidores de aplicativos e da web normal... . Além disso, teremos que fazer um breve panorama dos servidores de aplicação , que, na minha opinião, merecem nossa atenção.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION