JavaRush /Java Blog /Random-IT /Servizi web. Passaggio 2. Come semplificare la scrittura ...
eGarmin
Livello 41

Servizi web. Passaggio 2. Come semplificare la scrittura di un cliente?

Pubblicato nel gruppo Random-IT
In questa breve nota, vorrei rivisitare il codice client del servizio Web che abbiamo scritto nel passaggio precedente . In questo caso, presumo che tu abbia IDEA aperto e in esso il progetto del passaggio 1. Il nostro servizio web dovrebbe essere avviato in questo progetto:
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"));
    }
}
Nota quanto dobbiamo sapere in anticipo. Oltre al fatto che devi accedere alla descrizione wsdl (senza questo, scusa, non c'è modo):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
devi aprire tu stesso questo file xml e guardare il tag definitions, e in esso gli attributi targetNamespacee namechiamare il costruttore QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
quindi devi connetterti manualmente al tag service:
Service service = Service.create(url, qname);
e in esso al tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
e solo dopo possiamo chiamare il metodo remoto:
hello.getHelloString("JavaRush")
La domanda è: è per questo che i nostri bisnonni sono morti sui campi di battaglia, così che ora facciamo tutto a mano? E se non è nemmeno il nostro servizio web, ma quello di qualcun altro. Quindi questo processo sarà ancora più spiacevole. Il formato XML è progettato per essere letto dalle macchine, non dagli esseri umani. Quindi lasciamo che sia la macchina a fare il lavoro sporco e godiamoci il processo. Per questo non dobbiamo fare nulla di speciale, perché... Il nostro SDK preferito, chiamato JDK in Java, include un'utilità speciale chiamata wsimport . Ma prima le cose... Per prima cosa, creiamo un nuovo progetto in IDEA selezionando File > New Project... dal menu e dando al progetto il nome HelloWS . Quando ci viene chiesto dove aprire il progetto appena creato dobbiamo rispondere Nuova Finestra , cioè in una nuova finestra, perché noterò ancora una volta che è molto importante che il progetto precedente sia aperto, perché Ricordiamo dal passaggio 1 che abbiamo il nostro servizio web in esecuzione in quel progetto. Ovviamente puoi semplicemente avviarlo tramite la console Windows, ma non mi piace farlo. Dal nuovo progetto, apri la console selezionando View > Tool Windows > Terminal o semplicemente premendo Alt+F12 . Ora siamo nella root del progetto e dobbiamo entrare nella cartella src , quindi inseriamo il seguente comando nella console: cd src Ora è il momento di utilizzare l' utility wsimport . Funziona secondo il seguente principio: gli passiamo una descrizione WSDL e in risposta crea file stub (le cosiddette Stub-classes), che contengono già tutte le funzionalità di cui abbiamo bisogno per accedere al servizio web. Queste classi verranno inserite nel pacchetto ru.javarush.ws. Se chiedi da dove proviene il nome del pacchetto, la risposta è: il nome del pacchetto è lo spazio dei nomi di destinazione invertito rispetto alla descrizione WSDL . Ricordare l'attributo targetNamespacenel tag definitionsdel WSDL . Lì avevamo scritto quanto segue http:// ws.javarush.ru/. E questo non è l'indirizzo del sito, è così che è consuetudine descrivere gli spazi dei nomi in xml, e se scartiamo http://ed espandiamo ciò che rimane in ordine inverso, otterremo il nome del nostro pacchetto. Quindi, eseguiamo l'utilità: wsimport -keep http://localhost:1986/wss/hello?wsdl affinché funzioni, il percorso deve essere specificato nella variabile d'ambiente PATH oppure puoi semplicemente utilizzare il percorso completo. Per me si trova nella cartella C:\Program Files\Java\jdk1.8.0_31\bin . Tieni presente che tutto ciò che devi fare è passare il file WSDL tramite la chiave –keep , disponibile in remoto tramite un collegamento, a meno che, ovviamente, non abbiamo disabilitato il servizio web. Quali sono queste classi stub? Ce ne sono solo due. Uno di essi èHelloWebService, che è essenzialmente la stessa interfaccia del servizio Web che abbiamo creato manualmente nel passaggio 1. La differenza è minima e sta nel fatto che le annotazioni che abbiamo già riscontrato vengono utilizzate in modo leggermente diverso e inoltre vengono utilizzate annotazioni aggiuntive che Ho detto che non ne so nulla, ma poiché prima tutto funzionava per noi senza di loro, ovviamente non sono obbligatori. La seconda classe è stub HelloWebServiceImplService, che eredita dalla classe Service. Abbiamo già incontrato la classe Servicenel nostro client. Non fornirò il codice di questa classe, perché... Non sono quasi pronto a spiegare tutte le sue righe, ma l'essenza della classe si riduce al fatto che tutto ciò che abbiamo precedentemente scritto manualmente nel client per connetterci al servizio web viene creato automaticamente in questa classe e dobbiamo solo chiama uno dei suoi metodi e avremo tutto in openwork. Quindi riscriviamo il codice del nostro cliente in un nuovo progetto utilizzando queste classi e assicuriamoci che il codice sia più conciso. Per prima cosa, nella cartella src del nuovo progetto, creiamo un package ru.javarush.cliente in esso una classe HelloWebServiceClientcon un metodo 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") );
    }
}
L'analisi del codice è elementare e quello che ho descritto nei commenti è abbastanza. Dopo aver avviato il client, dovremmo vedere la riga: Hello, JavaRush Community!Allo stesso tempo, il client del progetto del passaggio 1 continuerà a lavorare e visualizzerà il testo che abbiamo scritto al suo interno, vale a dire: Hello, JavaRush! A questo punto, forse, possiamo finire questo Passo, perché il suo obiettivo è stato raggiunto. Ci siamo resi conto che se esiste una descrizione WSDL di un servizio web, allora jdk è pronto a fornirci la generazione automatica stubdi classi stub per semplificare la scrittura di un client per questo servizio web. Secondo me, questa è una funzionalità molto utile quando vuoi testare il servizio web di qualcun altro e non sbirciare nella sua descrizione WSDL . Uno sguardo al futuro Nel prossimo articolo sui servizi Web, vorrei delineare idee su come distribuire un servizio Web in un contenitore servlet Tomcat e in diversi server applicazioni, in modo da non dover eseguire il servizio Web come un applicazione separata, come abbiamo fatto nei primi 2 passaggi. Ma prima, penso che sarebbe meglio fare una breve digressione sull'argomento cosa sono i servlet, i contenitori servlet e come differiscono dai server delle applicazioni e dal web normale... . Inoltre, dovremo fare una breve panoramica sugli application server , che, a mio avviso, meritano la nostra attenzione.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION