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...
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:- 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.
- 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.
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:- Descreva a interface do nosso serviço web
- Implemente esta interface
- Inicie nosso serviço web
- Escreva um cliente e chame remotamente o método de serviço da web desejado
main
e 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 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);
}
Neste código, as classes são chamadas de anotações WebService
e WebMethod
nã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 SOAPBinding
se trata de uma anotação com parâmetros. Neste caso, é utilizado um parâmetro style
com 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 HelloWebServicePublisher
com 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 pacoteru.javarush.client
, e nele uma classe HelloWebServiceClient
com 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.
GO TO FULL VERSION