Il titolo dell'argomento è davvero una domanda, perché... Io stesso non so cosa sia e per la prima volta proverò a lavorarci nell'ambito di questo articolo. L'unica cosa che posso garantire è che il codice presentato di seguito funzionerà, ma le mie frasi saranno solo supposizioni e ipotesi su come io stesso comprendo tutto questo. Quindi andiamo...
introduzione
Dobbiamo iniziare dal motivo per cui è stato creato il concetto di servizi web. Quando questo concetto è apparso nel mondo, esistevano già tecnologie che consentivano alle applicazioni di interagire a distanza, dove un programma poteva chiamare un metodo in un altro programma, che poteva essere avviato su un computer situato in un'altra città o addirittura paese. Tutto questo è abbreviato in RPC (Remote Procedure Calling). Gli esempi includono le tecnologie CORBA e per Java - RMI (Remote Method Invoking). E tutto sembra andare bene in loro, soprattutto in CORBA, perché... Puoi lavorarci in qualsiasi linguaggio di programmazione, ma mancava ancora qualcosa. Credo che lo svantaggio di CORBA sia che funziona attraverso alcuni dei suoi protocolli di rete invece del semplice HTTP, che può passare attraverso qualsiasi firewall. L'idea del servizio web era quella di creare un RPC da inserire nei pacchetti HTTP. Inizia così lo sviluppo dello standard. Quali sono i concetti base di questa norma:- SAPONE . Prima di chiamare una procedura remota, è necessario descrivere questa chiamata in un file XML in formato SOAP. SOAP è semplicemente uno dei tanti markup XML utilizzati nei servizi Web. Tutto ciò che vogliamo inviare da qualche parte tramite HTTP viene prima convertito in una descrizione SOAP XML, quindi inserito in un pacchetto HTTP e inviato a un altro computer sulla rete tramite TCP/IP.
- WSDL . Esiste un servizio web, ad es. un programma i cui metodi possono essere chiamati in remoto. Ma lo standard richiede che questo programma sia accompagnato da una descrizione che dice: "sì, hai ragione, questo è davvero un servizio web e da esso puoi chiamare questi e quei metodi". Questa descrizione è rappresentata da un altro file XML, che ha un formato diverso, vale a dire WSDL. Quelli. WSDL è solo un file XML che descrive un servizio web e niente di più.
Approccio generale
Nei servizi web c'è sempre un client e un server. Il server è il nostro servizio Web e talvolta viene chiamato endpoint (come in, il punto finale dove raggiungono i messaggi SOAP dal client). Dobbiamo fare quanto segue:- Descrivi l'interfaccia del nostro servizio web
- Implementare questa interfaccia
- Avvia il nostro servizio web
- Scrivere un client e chiamare in remoto il metodo del servizio Web desiderato
main
e avviare il servizio Web direttamente come server oppure distribuirlo su un server come Tomcat o qualsiasi altro. Nel secondo caso, noi stessi non lanciamo un nuovo server e non apriamo un'altra porta sul computer, ma diciamo semplicemente al contenitore servlet Tomcat che "abbiamo scritto classi di servizi web qui, per favore pubblicale in modo che tutti coloro che ti contattano possano utilizzare il nostro servizio web." Indipendentemente dal metodo di avvio del servizio web, avremo lo stesso client.
server
Lanciamo IDEA e creiamo un nuovo progetto Crea nuovo progetto . Specificare il nome HelloWebService e fare clic sul pulsante Avanti , quindi sul pulsante Fine . Nella cartella src creeremo il pacchetto ru.javarush.ws . In questo pacchetto creeremo un'interfacciaHelloWebService
:
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);
}
In questo codice, le classi sono le cosiddette annotazioni WebService
e WebMethod
non fanno altro che contrassegnare la nostra interfaccia e il suo metodo come servizio web. Lo stesso vale per la classe SOAPBinding
. L'unica differenza è che SOAPBinding
si tratta di un'annotazione con parametri. In questo caso viene utilizzato un parametro style
con un valore che indica che il servizio web funzionerà non tramite messaggi di documento, ma come un classico RPC, cioè per chiamare un metodo. Implementiamo la logica dell'interfaccia e creiamo una classe nel nostro pacchetto HelloWebServiceImpl
. A proposito, noto che terminare una classe con Impl è una convenzione in Java, secondo la quale l'implementazione delle interfacce è così designata (Impl - dalla parola implementazione, cioè implementazione). Questo non è un requisito e sei libero di nominare la classe come preferisci, ma le buone maniere lo richiedono:
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 + "!";
}
}
Lanciamo il nostro servizio web come server indipendente, ad es. senza la partecipazione di Tomcat e server delle applicazioni (questo è un argomento per una discussione separata). Per fare ciò, nella struttura del progetto nella cartella src , creeremo un pacchetto ru.javarush.endpoint
e in esso creeremo una classe HelloWebServicePublisher
con un metodo 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());
}
}
Ora eseguiamo questa classe premendo Shift+F10 . Non apparirà nulla nella console, ma il server è in esecuzione. Puoi verificarlo digitando la riga http://localhost:1986/wss/hello?wsdl nel tuo browser . La pagina che si apre dimostra da un lato che abbiamo un server web (http://) in esecuzione sulla porta 1986 del nostro computer (localhost) e dall'altro mostra una descrizione WSDL del nostro servizio web. Se interrompi l'applicazione, la descrizione non sarà più disponibile, così come il servizio web stesso, quindi non lo faremo, ma passeremo alla scrittura del client.
Cliente
Nella cartella del progetto src creeremo un pacchettoru.javarush.client
e in esso una classe HelloWebServiceClient
con un metodo 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"));
}
}
Ho dato il massimo dei commenti sul codice nell'elenco. Non ho nulla da aggiungere, quindi eseguiamo (Shift+F10). Dovremmo vedere il testo nella console: Hello, JavaRush!
Se non l'hai visto, probabilmente hai dimenticato di avviare il servizio web.
GO TO FULL VERSION