JavaRush /Blogue Java /Random-PT /Serviços web. Passo 1. O que é um serviço web e como trab...
eGarmin
Nível 41

Serviços web. Passo 1. O que é um serviço web e como trabalhar com ele?

Publicado no grupo Random-PT
O título do tópico é realmente uma pergunta, porque... Eu mesmo não sei o que é e pela primeira vez tentarei trabalhar com isso no âmbito deste artigo. A única coisa que posso garantir é que o código apresentado abaixo funcionará, mas minhas frases serão apenas suposições e suposições sobre como eu mesmo entendo tudo isso. Então vamos... Serviços web.  Passo 1. O que é um serviço web e como trabalhar com ele?  - 1

Introdução

Precisamos começar explicando por que o conceito de serviços web foi criado. Na época em que esse conceito surgiu no mundo, já existiam tecnologias que permitiam a interação de aplicações à distância, onde um programa poderia chamar algum método em outro programa, que poderia ser lançado em um computador localizado em outra cidade ou mesmo país. Tudo isso é abreviado como RPC (Remote Procedure Calling). Os exemplos incluem tecnologias CORBA e para Java - RMI (Remote Method Invoking). E tudo parece estar bem neles, principalmente no CORBA, porque... Você pode trabalhar com ele em qualquer linguagem de programação, mas ainda faltava alguma coisa. Acredito que a desvantagem do CORBA é que ele funciona através de alguns de seus próprios protocolos de rede, em vez do simples HTTP, que cabe em qualquer firewall. A ideia do web service era criar um RPC que fosse inserido em pacotes HTTP. Assim começou o desenvolvimento do padrão. Quais são os conceitos básicos desta norma:
  1. SABÃO . Antes de chamar um procedimento remoto, você precisa descrever esta chamada em um arquivo XML no formato SOAP. SOAP é simplesmente uma das muitas marcações XML usadas em serviços da web. Tudo o que queremos enviar para algum lugar via HTTP é primeiro convertido em uma descrição XML SOAP, depois inserido em um pacote HTTP e enviado para outro computador na rede via TCP/IP.
  2. WSDL . Existe um serviço web, ou seja, um programa cujos métodos podem ser chamados remotamente. Mas o padrão exige que este programa seja acompanhado por uma descrição que diz: “sim, você está certo - este é realmente um serviço da web e você pode chamar tais e tais métodos a partir dele”. Esta descrição é representada por outro arquivo XML, que possui um formato diferente, nomeadamente WSDL. Aqueles. WSDL é apenas um arquivo XML que descreve um serviço web e nada mais.
Por que você pergunta tão brevemente? Você não pode ser mais específico? Provavelmente é possível, mas para fazer isso você terá que recorrer a livros como T. Mashnin, “Java Web Services”. Lá, ao longo das primeiras 200 páginas, há uma descrição detalhada de cada tag dos padrões SOAP e WSDL. Vale a pena fazer? Na minha opinião não, porque... tudo isso é criado automaticamente em Java, e você só precisa escrever o conteúdo dos métodos que devem ser chamados remotamente. Assim, uma API como JAX-RPC apareceu em Java. Se alguém não sabe, quando fala que Java possui tal e tal API, significa que existe um pacote com um conjunto de classes que encapsulam a tecnologia em questão. O JAX-RPC evoluiu ao longo do tempo de versão para versão e eventualmente se tornou JAX-WS. WS obviamente significa WebService e você pode pensar que isso é simplesmente uma renomeação de RPC como uma palavra da moda popular atualmente. Isto não é verdade, porque Agora, os serviços da web se afastaram da ideia original e permitem não apenas chamar métodos remotos, mas também simplesmente enviar mensagens de documentos no formato SOAP. Ainda não sei por que isso é necessário; é improvável que a resposta aqui seja “caso seja necessário”. Eu mesmo gostaria de aprender com camaradas mais experientes. E, por último, o JAX-RS apareceu para os chamados serviços web RESTful, mas este é o tópico de um artigo separado. A introdução pode terminar aqui, porque... A seguir aprenderemos a trabalhar com JAX-WS.

Abordagem geral

Nos serviços web sempre existe um cliente e um servidor. O servidor é nosso serviço web e às vezes é chamado de endpoint (como o ponto final onde as mensagens SOAP do cliente chegam). Precisamos fazer o seguinte:
  1. Descreva a interface do nosso serviço web
  2. Implemente esta interface
  3. Inicie nosso serviço web
  4. Escreva um cliente e chame remotamente o método de serviço da web desejado
Você pode iniciar um serviço web de diferentes maneiras: descrever uma classe com um método maine iniciar o serviço web diretamente como um servidor ou implantá-lo em um servidor como o Tomcat ou qualquer outro. No segundo caso, nós mesmos não lançamos um novo servidor e não abrimos outra porta no computador, mas simplesmente informamos ao contêiner do servlet Tomcat que “escrevemos classes de serviço da web aqui, publique-as para que todos que entrarem em contato com você possam use nosso serviço da web." Independentemente da forma de lançamento do web service, teremos o mesmo cliente.

Servidor

Vamos lançar o IDEA e criar um novo projeto Create New Project . Especifique o nome HelloWebService e clique no botão Avançar e depois no botão Concluir . Na pasta src criaremos o pacote ru.javarush.ws . Neste pacote criaremos uma 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);
}
Neste código, as classes são chamadas de anotações WebServicee WebMethodnão fazem nada além de marcar nossa interface e seu método como um serviço web. O mesmo se aplica à classe SOAPBinding. A única diferença é que SOAPBindingse trata de uma anotação com parâmetros. Neste caso, é utilizado um parâmetro stylecom um valor que indica que o serviço web funcionará não através de mensagens de documentos, mas como um RPC clássico, ou seja, para chamar um método. Vamos implementar nossa lógica de interface e criar uma classe em nosso pacote HelloWebServiceImpl. A propósito, observo que terminar uma classe com Impl é uma convenção em Java, segundo a qual a implementação de interfaces é assim designada (Impl - da palavra implementação, ou seja, implementação). Isso não é um requisito e você é livre para nomear a classe como quiser, mas as boas maneiras exigem isso:
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 + "!";
    }
}
Vamos lançar nosso serviço web como um servidor independente, ou seja, sem a participação de nenhum Tomcat e servidores de aplicativos (este é um tópico para uma discussão separada). Para isso, na estrutura do projeto na pasta src , criaremos um pacote ru.javarush.endpoint, e nele criaremos uma classe HelloWebServicePublishercom um método 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());
    }
}
Agora vamos executar esta classe pressionando Shift+F10 . Nada aparecerá no console, mas o servidor está em execução. Você pode verificar isso digitando a linha http://localhost:1986/wss/hello?wsdl em seu navegador . A página que se abre, por um lado, prova que temos um servidor web (http://) rodando na porta 1986 do nosso computador (localhost), e, por outro lado, mostra uma descrição WSDL do nosso serviço web. Se você parar o aplicativo, a descrição ficará indisponível, assim como o próprio serviço web, então não faremos isso, mas passaremos a escrever o cliente.

Cliente

Na pasta do projeto src criaremos um pacote ru.javarush.client, e nele uma classe HelloWebServiceClientcom um método 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"));
    }
}
Dei comentários máximos sobre o código da listagem. Não tenho nada a acrescentar, então vamos executar (Shift+F10). Deveríamos ver o texto no console: Hello, JavaRush!Se você não viu, provavelmente esqueceu de iniciar o serviço web.

Conclusão

Este tópico forneceu uma breve excursão aos serviços da web. Mais uma vez, direi que muito do que escrevi é meu palpite sobre como funciona e, portanto, você não deve confiar muito em mim. Ficaria grato se pessoas conhecedoras me corrigissem, porque assim aprenderei alguma coisa. Atualização. Vamos continuar a conversa
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION