Come configurare smartphone e PC. Portale informativo

linguaggio wsdl. di cui ho già scritto

C'era una volta che mi è stato affidato il compito di avviare lo sviluppo di servizi Web e mi ha dato i progetti per il progetto più semplice senza alcuna spiegazione. Il progetto, ovviamente, non è partito. Cos'è la primavera e come funziona, anche io non ne avevo idea. Inoltre non sono riuscito a trovare articoli adeguati sullo sviluppo di servizi Web utilizzando Spring, né in russo né in inglese. Ho dovuto affrontare tutto da solo, si è scoperto che non era così spaventoso.
E di recente, ho deciso di vedere quali nuove funzionalità sono state aggiunte a Spring da allora e di aggiornare i vecchi servizi, cosa che di conseguenza mi ha spinto a scrivere questo articolo.

Questo articolo è una guida allo sviluppo di un semplice servizio Web utilizzando il protocollo SOAP utilizzando Spring-WS.

E così, scriveremo il servizio più semplice An che accetta un nome utente e invia un saluto e l'ora corrente sul server.

Di cosa avremo bisogno?
  • IDE. Sto usando Eclipse.
Preparazione al lavoro
Noi creiamo nuovo progetto Applicazioni web. In Eclipse è: "File => Nuovo => Progetto Web dinamico".
Ho chiamato il progetto: HelloService.
Successivamente, copia le librerie da Spring, XMLBean, wsdl4j, commons-logging nella directory del progetto WEB-INF/lib.
Se lo desideri, puoi aggiungerli alle librerie del server in modo da non portarli con ogni applicazione.
Creazione di uno schema WSDL
Essenzialmente, uno schema WSDL ha lo scopo di descrivere un servizio.
Ovviamente non lo creeremo manualmente. Lo schema verrà generato automaticamente dagli strumenti di Spring, ma ne parleremo più avanti.
Definire i dati di input e output
Dati in ingresso:
  • Nome stringa.
Produzione:
  • Stringa di saluto;
  • Ora ora corrente.
Creiamo una descrizione dei dati di input e output
Nella directory WEB-INF creare il file HelloService.xsd. Questa vita sarà necessario per generare lo schema WSDL e creare le classi Java corrispondenti.
Testo del file:

Attributo targetNamespace- lo spazio dei nomi da utilizzare. Quelli. tutti gli oggetti creati si troveranno nel pacchetto org.example.helloService.
Elementi Richiesta servizio e ServizioRisposta descrivono rispettivamente i dati di input e di output (richiesta/risposta).
Attributi minOccurs e maxOccurs determinare il numero di ripetizioni di un dato componente all'interno di un elemento. Se questi parametri non vengono specificati, per impostazione predefinita vengono considerati uguali a 1. Per un componente facoltativo, è necessario specificare minOccurs=0. Con un numero illimitato di componenti: maxOccurs=unbounded.
Puoi leggere di più sugli schemi XML.
Creazione di JavaBean
Sulla base dello schema creato, creeremo classi Java. Per fare ciò, crea un file build.xml:

Parametro WS_HOME deve puntare alla directory in cui risiede XMLBeans.
HelloService.xsd- il percorso dello schema creato.
lib\helloservice.jar- la libreria java in fase di creazione.

Quindi, esegui Ant-build (spero che tu l'abbia già installato).
In Eclipse, puoi eseguirlo in questo modo: RMB sul file build.xml => Esegui come => Ant Build.
Se attraverso riga di comando:
ant-buildfile build.xml
Bene, stiamo aspettando il completamento della costruzione. Successivamente, possiamo controllare la directory del progetto WEB-INF\lib per la presenza della libreria corrispondente (helloservice.jar).

Implementazione del servizio
Creare un'interfaccia e una classe di servizio
Interfaccia di servizio: HelloService.java:
pacchetto org.esempio; import java.util.Calendar; public interface HelloService ( public String getHello(String name) genera un'eccezione; public Calendar getCurrentTime(); )
Implementazione del servizio: HelloServiceImpl.java:
pacchetto org.esempio; import java.util.Calendar; import org.springframework.stereotype.Service; @Service public class HelloServiceImpl implementa HelloService ( public String getHello(String name) throws Exception ( return "Hello, " + name + "!"; ) public Calendar getCurrentTime() ( return Calendar.getInstance(); ) )
Questo codice, credo, non ha bisogno di commenti. L'unica cosa che può causare domande a persone che non hanno mai incontrato Spring è l'annotazione @ Service, ma ne parlerò un po 'più tardi.
punto finale
Endpoint: una classe che sarà responsabile dell'elaborazione delle richieste in arrivo (una sorta di punto di ingresso).

Crea file HelloServiceEndpoint.java:
pacchetto org.esempio; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.example.helloService.ServiceRequestDocument; import org.example.helloService.ServiceRequestDocument.ServiceRequest; import org.example.helloService.ServiceResponseDocument; import org.example.helloService.ServiceResponseDocument.ServiceResponse; @Endpoint public class HelloServiceEndpoint( private static final String namespaceUri = "http://www.example.org/HelloService"; private HelloService helloService; @Autowired public void HelloService (HelloService helloService) ( this.helloService = helloService; ) @PayloadRoot( localPart = "ServiceRequest", namespace = namespaceUri) public ServiceResponseDocument getService(ServiceRequestDocument request) genera un'eccezione ( ServiceRequestDocument reqDoc = request; ServiceRequest req = reqDoc.getServiceRequest(); ServiceResponseDocument respDoc = ServiceResponseDocument.Factory.newInstance(); ServiceResponse resp = respDoc. addNewServiceResponse(); String userName = req.getName(); String helloMessage = testNewService.getHello(userName); Calendar currentTime = testNewService.getCurrentTime(); resp.setHello(helloMessage); resp.setCurrentTime(currentTime); return respDoc; ) )
Cosa si fa qui?
annotazione @endpoint determina solo che questa classe elaborerà le richieste in arrivo.
namespaceUri– lo stesso spazio dei nomi specificato durante la creazione dello schema xml.

Ora torniamo un po 'indietro e ricordiamo l'annotazione @ servizio. Senza entrare nei dettagli, per non sovraccaricare il lettore con informazioni non necessarie, questa annotazione dice a Spring di creare l'oggetto appropriato. @Autowired serve per l'iniezione sostituzione automatica) dell'oggetto corrispondente. Ovviamente, quando si creano applicazioni semplici, non ha senso utilizzare queste annotazioni, ma ho comunque deciso di non escluderle in questo esempio.

Il resto, ancora una volta, dovrebbe essere tutto chiaro. Si noti che ServiceRequest, ServiceResponse, ecc. - queste sono solo le classi che sono state create in base al nostro schema xml.

Configurazione del servizio primaverile
Qui si avvicina la fine.
Creare un file service-ws-servlet.xml.

sws: guidato dalle annotazioni- dice solo quello dentro questo progetto vengono utilizzate le annotazioni.
MA contesto: scansione del componente specifica il pacchetto in cui cercare le annotazioni, inclusi i sottopacchetti.

I prossimi due bidoni saranno sempre gli stessi. La loro essenza sta nel ricevere e convertire una richiesta da Xml in un oggetto Java e quindi riconvertirla.

sws:dinamico-wsdl responsabile di generazione automatica Documento WSDL basato sullo schema XML generato.
Posizione indica il percorso dello schema.
locationUri– indirizzo (relativo al contenitore) dove sarà disponibile lo schema WSDL.
Nel mio caso, il WSDL è disponibile al seguente indirizzo:
host locale/HelloService/HelloService.wsdl

Descrittore di distribuzione
E infine, l'ultimo.
Nella directory WEB-INF, modifichiamo o creiamo un file web.xml.
ciao servizio ciao servizio servizio ws org.springframework.ws.transport.http.MessageDispatcherServlet transformWsdlLocations VERO servizio ws /*
Non descriverò più questo file, la maggior parte delle persone dovrebbe già saperlo. Per progetti semplici, essenzialmente non dovrebbe cambiare. Vale solo la pena notare che il nome servlet (servlet-name) deve corrispondere al nome del file di configurazione Spring del servizio servizio ws-servlet.xml.
Controllo della salute
Il primissimo segno corretto funzionamentoè lo schema WSDL generato.
Per verificare, basta andare all'indirizzo di questo schema (http://localhost/HelloService/HelloService.wsdl) e guardare: lì dovrebbe essere visualizzato un file xml. Se non viene visualizzato nulla o quale errore è apparso, rileggiamo attentamente l'intero articolo e cerchiamo cosa abbiamo fatto di sbagliato.

Per ulteriori verifiche, abbiamo bisogno di soapUI (ho la versione 3.0.1).
Installalo ed eseguilo.
Crea un nuovo progetto: File => Nuovo progetto soapUI. Nel campo WSDL/WADL iniziale inserire un collegamento allo schema WSDL (http://localhost/HelloService/HelloService.wsdl).
Nel progetto creato, apri la richiesta richiesta.

Nel campo Nome, inserisci un nome e clicca sul pulsante "Invia richiesta".


Di conseguenza, riceviamo una risposta dal server con un saluto e l'ora corrente.


Se qualcosa è andato storto, rileggi di nuovo questo articolo.

Qual è il prossimo?
Bene, allora dobbiamo scrivere un client per questo servizio Web. Ma questo è già materiale per un altro articolo, che potrebbe essere scritto in seguito, se dato materiale qualcuno sarà interessato.

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 qui sotto funzionerà, tuttavia, le mie frasi saranno solo supposizioni e supposizioni su come io stesso capisco tutto questo. Quindi andiamo...

introduzione

Dobbiamo iniziare con ciò per cui è stato creato il concetto di servizi web. Quando è apparso questo concetto, 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 quindi essere avviato su un computer situato in un'altra città o addirittura in un paese. Tutto questo è abbreviato in RPC (Remote Procedure Calling - chiamata di procedura remota). Gli esempi includono le tecnologie CORBA e per Java - RMI (Remote Method Invoking - chiamata di metodo remoto). E tutto sembra andare bene in loro, specialmente 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 passerà attraverso qualsiasi firewall. L'idea di un servizio Web era creare un tale RPC che sarebbe stato inserito nei pacchetti HTTP. Iniziò così lo sviluppo dello standard. Quali sono i concetti di base di questo standard:
  1. SAPONE. Prima di chiamare una procedura remota, è necessario descrivere questa chiamata in un file XML del formato SOAP. SOAP è solo uno dei tanti markup XML utilizzati nei servizi web. Tutto ciò che vogliamo inviare da qualche parte tramite HTTP viene prima trasformato in una descrizione SOAP XML, quindi inserito in un pacchetto HTTP e inviato a un altro computer sulla rete tramite TCP / IP.
  2. WSDL. Esiste un servizio web, ad es. un programma i cui metodi possono essere chiamati in remoto. Ma lo standard richiede che a questo programma sia allegata una descrizione, che dice che "sì, non ti sei sbagliato - questo è davvero un servizio web e puoi chiamare questo o quel metodo da esso". Questa descrizione è rappresentata da un altro file XML che ha un formato diverso, ovvero WSDL. Quelli. WSDL è solo un file XML che descrive un servizio Web e nient'altro.
Perché così breve chiedi? Non puoi entrare più nel dettaglio? Probabilmente puoi, ma per questo dovrai rivolgerti a libri come Mashnin T. "Java Web Services". Lì per i primi 200 pagine in arrivo una descrizione dettagliata di ogni tag degli standard SOAP e WSDL. Ne vale la pena? Secondo me no, perché tutto questo viene creato automaticamente in Java e devi solo scrivere il contenuto dei metodi che dovrebbero essere chiamati da remoto. Quindi, in Java esiste un'API come JAX-RPC. Se qualcuno non sa quando dice che Java ha questa e quella API, significa che esiste un pacchetto con un insieme di classi che incapsulano la tecnologia in questione. JAX-RPC si è evoluto da una versione all'altra per molto tempo e alla fine si è evoluto in JAX-WS. WS ovviamente sta per WebService e potresti pensare che questa sia una semplice ridenominazione di RPC in una parola d'ordine popolare in questi giorni. Non è così, perché ora i servizi Web si sono allontanati dall'idea originale e consentono non solo di chiamare metodi remoti, ma anche di inviare semplicemente messaggi di documento in formato SOAP. Perché è necessario, non lo so ancora, è improbabile che la risposta qui sia "per ogni evenienza, è improvvisamente necessario". Io stesso vorrei imparare da compagni più esperti. E infine, JAX-RS è apparso per i cosiddetti servizi web RESTful, ma questo è un argomento per un articolo a parte. Questa introduzione può essere completata, perché. successivamente impareremo come lavorare con JAX-WS.

Approccio generale

I servizi Web hanno sempre un client e un server. Il server è il nostro servizio Web ed è talvolta indicato come l'endpoint (ad esempio, punto finale, dove arrivano i messaggi SOAP dal client). Dobbiamo fare quanto segue:
  1. Descrivi l'interfaccia del nostro servizio web
  2. Implementa questa interfaccia
  3. Avvia il nostro servizio web
  4. Scrivi un client e chiama da remoto il metodo del servizio web desiderato
Il servizio Web può essere avviato diversi modi: descrivi una classe con un metodo principale ed esegui il servizio Web direttamente come server o distribuiscilo su un server come Tomcat o qualsiasi altro. Nel secondo caso, noi stessi non lanciamo nuovo server e non apriamo un'altra porta sul computer, ma semplicemente diciamo 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 da come viene lanciato il servizio web, avremo lo stesso client.

server

Avvia IDEA e crea un nuovo progetto Crea nuovo progetto. Specifica un nome hellowebservice e premere il pulsante Prossimo, quindi il pulsante Fine. Nella cartella src creare un pacchetto it.javarush.ws. In questo pacchetto creeremo l'interfaccia HelloWebService: pacchetto ru. javarush. ws; // queste sono annotazioni, ad es. un modo per contrassegnare le nostre classi e metodi, // in relazione alla tecnologia dei servizi web importa javax. jws. Metodo Web; importa javax. jws. servizio web; importa javax. jws. sapone. SOAPLegame; // diciamo che la nostra interfaccia funzionerà come un servizio web@Servizio web // indica che il servizio Web verrà utilizzato per chiamare i metodi@SOAPBinding(style = SOAPBinding.Style.RPC) interfaccia pubblica HelloWebService( // dice che questo metodo può essere chiamato da remoto@WebMethod public String getHelloString(String name) ; ) In questo codice, le classi WebService e WebMethod sono le cosiddette annotazioni e 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 è un'annotazione con parametri. A questo caso il parametro style viene utilizzato con un valore che indica che il servizio Web funzionerà non tramite messaggi di documento, ma come un classico RPC, ovvero per chiamare il metodo. Implementiamo la nostra logica di interfaccia e creiamo una classe HelloWebServiceImpl nel nostro pacchetto. A proposito, noto che la classe che termina 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; // stessa annotazione della descrizione dell'interfaccia, importa javax. jws. servizio web; // ma qui viene utilizzato con il parametro endpointInterface, // indicando nome e cognome classe di interfaccia del nostro servizio web@WebService(endpointInterface= "it.javarush.ws.HelloWebService") public class HelloWebServiceImpl implementa HelloWebService ( @Override public String getHelloString (String name) ( // restituisci solo il saluto return "Ciao, " + nome + "!" ; ) ) Eseguiamo il nostro servizio Web come server autonomo, ad es. senza la partecipazione di Tomcat e application server (questo è un argomento per una discussione separata). Per fare ciò, nella struttura del progetto nella cartella src creiamo un pacchetto ru.javarush.endpoint , e in esso creeremo una classe HelloWebServicePublisher con il metodo main: package ru. javarush. punto finale; // class per avviare un server Web con servizi Web importa javax. xml. ws. punto finale; // classe del nostro servizio web importare it. javarush. ws. ciaowebserviceimpl; public class HelloWebServicePublisher( public static void main(String. . . args)( // avvia il web server sulla porta 1986 // e all'indirizzo specificato nel primo argomento, // avvia il servizio Web passato nel secondo argomento punto finale. pubblicare( "http://localhost:1986/wss/ciao", nuovo HelloWebServiceImpl() ); ) ) Ora esegui questa classe facendo clic Maiusc+F10. Nella console non verrà visualizzato nulla, ma il server è in esecuzione. Puoi verificarlo digitando http://localhost:1986/wss/hello?wsdl nel tuo browser. La pagina aperta, da un lato, dimostra che abbiamo un web server (http://) in esecuzione sulla porta 1986 sul nostro computer (localhost) e, dall'altro, mostra la descrizione WSDL del nostro servizio web. Se interrompi l'applicazione, la descrizione diventerà inaccessibile, così come il servizio web stesso, quindi non lo faremo, ma passeremo alla scrittura del client.

Cliente

Nella cartella del progetto src creiamo un pacchetto ru.javarush.client , e in esso la classe HelloWebServiceClient con il metodo principale: pacchetto ru. javarush. cliente; // necessario per ottenere la descrizione wsdl e attraverso di essa // raggiungere il servizio Web stesso importa java. rete. URL; // tale eccezione si verificherà quando si lavora con l'oggetto URL importa java. rete. Eccezione URL malformata; // classi per analizzare xml con descrizione wsdl // e cerca il codice di matricola al suo interno importa javax. xml. spazio dei nomi. Qnome; importa javax. xml. ws. servizio; // interfaccia del nostro servizio web (abbiamo bisogno di più) importare it. javarush. ws. ciaoservizioweb; public class HelloWebServiceClient( public static void main(String args) getta MalformedURLException( // crea un collegamento alla descrizione wsdl URL= nuovo URL( "http://localhost:1986/wss/ciao?wsdl") ; // Osserviamo i parametri del prossimo costruttore nel primissimo tag di descrizione WSDL - definizioni // guarda il primo argomento nell'attributo targetNamespace // Il secondo argomento cerca nell'attributo name QName qname = nuovo QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // Ora possiamo raggiungere il tag di matricola nella descrizione wsdl, Servizio servizio = Servizio. crea (url, qname) ; // e quindi al tag port annidato in esso, in modo che // ottiene un riferimento a un oggetto di servizio Web remoto da noi HelloWebService ciao = servizio. getPort(HelloWebService.class) ; // Evviva! Ora puoi chiamare metodo remoto Sistema. fuori. println(ciao. getHelloString("JavaRush" ) ); ) ) Ho fornito un massimo di commenti sul codice nell'elenco. Non ho niente da aggiungere, quindi corri (Maiusc + F10). Dovremmo vedere il testo nella console: Hello, JavaRush! Se non l'hai visto, probabilmente hai dimenticato di avviare il servizio web.

Conclusione

Questo thread presentato breve digressione ai servizi web. Ancora una volta, gran parte di ciò che ho scritto è una mia ipotesi su come funziona, e quindi non ci si dovrebbe fidare troppo di me. Sarei grato se persone esperte mi correggessero, perché poi imparerò qualcosa. UPD.

WSDL (Lingua di descrizione dei servizi Web) la versione 1.1 è stata pubblicata il 15 marzo 2001. WSDLè un formato basato su XML utilizzato per descrivere i servizi Web utilizzando messaggi contenenti informazioni su come accedere a un particolare servizio Web. WSDLè estensibile per consentire la descrizione dei servizi (servizi) e dei relativi messaggi indipendentemente dai formati dei messaggi o dai protocolli di rete utilizzati per il trasporto, tuttavia, WSDL 1.1 è più comunemente utilizzato insieme a SOAP 1.1, HTTP GET/POST e MIME. Perché il WSDLè stato sviluppato in collaborazione con SOAP, lo stesso Microsoft, Ariba e IBM. Se guardiamo il documento WSDL intuitivamente, si può dire che lo consente rispondere a 4 domande:

1) cosa stai facendo? La risposta a questa domanda è data in una forma adatta sia alla percezione umana che alla forma percepita da una macchina. Risposta per le persone nei tag:<nome/>, <documentazione/>, per la macchina -<Messaggio/>, <pointType>

2) Che lingua parli? (che tipi stai usando?) Rispondi nel tag:<tipi/>

3) Come comunicherò con te? (come accederà il client al servizio Web?): HTTP o SMTP. La risposta è dentro<legame/>

4) dove posso trovarti? (dove posso trovare questo servizio web o qual è il suo URL?). La risposta è:<servizio/>

Struttura:

Ogni documento WSDL può essere suddiviso in tre parti logiche:

1. definizione dei tipi di dati - definizione del tipo di messaggi inviati e ricevuti dal servizio XML

2. operazioni astratte - elenco delle operazioni eseguibili sui messaggi

3. vincolo di servizio - il modo in cui il messaggio verrà recapitato

I documenti WSDL può essere creato manualmente, ma la rigorosa formalizzazione del linguaggio WSDL consente di automatizzare il processo di scrittura WSDL-documenti. Molti strumenti per la creazione di servizi Web contengono utilità che creano automaticamente WSDL-file che descrivono servizi Web già pronti. Ad esempio, Web Services Authoring Tool Asse Apache contiene una classe Java2WSDL, creando WSDL-file per classe o interfaccia Java che descrive il servizio Web. Il pacchetto IBM WSTK, che include Asse, contiene utilità java2wsdl A che crea e avvia un oggetto da questa classe. Funziona dalla riga di comando.

Elementi di un documento WSDL

Descriviamo i tag WSDL più comunemente usati:

Etichetta è il tag principale di tutti i documenti WSDL. Definisce diversi spazi dei nomi:

1) target Namespace è lo spazio dei nomi del nostro servizio web

2) xmlns - spazio dei nomi del documento WSDL standard

3) xmlns: SOAP_ENC è lo spazio dei nomi utilizzato per descrivere la codifica SOAP


4) xmlns: impl e intf - lo spazio dei nomi dell'implementazione e della definizione del nostro servizio web

・Documento di definizione del servizio web

・Documento per l'implementazione del servizio Web

Per semplicità, di norma viene utilizzato 1 file, che contiene tutte le informazioni

Elemento - fornisce informazioni sui dati trasferiti da un endpoint a un altro.

Per descrivere una chiamata RPC, è necessario creare un messaggio di input e un messaggio di output.

All'interno di questo elemento è possibile specificare i parametri del metodo utilizzando l'elemento

Elemento descrive e definisce le operazioni o le modalità supportate dal servizio web

Le operazioni possono avere messaggi di input e messaggi di errore.

Elemento - descrive come le operazioni definite nel tipo di porta verranno trasmesse sulla rete. Perché L'elemento utilizza un tipo di porta, deve specificare un tipo definito da qualche parte in precedenza nel documento.

Elemento - indica dove trovare il servizio web

Elemento importare . Molto spesso l'elemento di servizio è separato nel suo documento wsdl per ragioni di praticità.

Per consentire di assemblare un documento wsdl da più documenti, viene utilizzato l'elemento import. Ti permette di includere un documento wsdl in un altro.

Elemento tipi consente di specificare i tipi di dati trasmessi se non sono standard.

WSDL supporta 4 modalità di funzionamento:

operazioni unidirezionali o operazioni unidirezionali. Il messaggio viene inviato all'endpoint del servizio. In questo caso, l'operazione è descritta da un solo messaggio di input.

· Richiesta-risposta: modalità richiesta-risposta. Questa modalità di funzionamento è la più comune. In questa modalità, la descrizione dell'operazione contiene un messaggio di input e output e un messaggio di errore facoltativo.

· Operazione di tipo demand-response. In questa modalità, l'endpoint è un client di un altro endpoint. Il formato dell'operazione è simile alla modalità challenge-response, ma i dati di output vengono elencati prima dei dati di input.

· Avviso di funzionamento. Questa modalità è un'altra versione della primitiva di trasmissione unidirezionale in cui l'endpoint invia il messaggio anziché riceverlo. L'operazione contiene solo un messaggio di output.

Prefazione

I clienti dei clienti hanno chiesto ai clienti i file xsd per le strutture passate dai servizi Web implementati. I clienti in risposta hanno suggerito che i clienti dei clienti realizzassero WSDL. Quella. inaspettatamente "di punto in bianco" è diventato necessario creare non solo schemi xsd per la convalida dei dati, ma "interi WSDL". Di solito i WSDL vengono utilizzati per SOAP e abbiamo REST ...

di cui ho già scritto

introduzione

Il termine servizi Web è solitamente associato a servizi basati su operazioni o azioni basati su standard SOAP o WS* come WS-Addressing o WS-Security. Il termine servizi Web REST di solito si riferisce a un'architettura basata su risorse di servizi Web che trasmettono XML su HTTP. Ciascuno di questi stili architettonici ha il proprio posto, ma fino a poco tempo fa lo standard WSDL non supportava entrambi questi stili. Il binding HTTP WSDL 1.1 era quindi inadeguato per descrivere la comunicazione utilizzando XML su HTTP. non esisteva un modo formale per descrivere i servizi Web REST utilizzando WSDL. Pubblicazione dello standard WSDL 2.0 (sviluppato pensando alla necessità di descrivere i servizi Web REST) ​​come World Recommendation ampia rete Il Consortium (W3C) ha fornito un linguaggio per descrivere i servizi Web REST.

REST è uno stile architettonico che tratta il Web come un'applicazione incentrata sulle risorse. In pratica, questo significa che ogni URL in un'applicazione RESTful è una risorsa. Gli URL sono facili da capire e da ricordare. Ad esempio, una libreria potrebbe definire l'URL http://www.bookstore.com/books/ per un elenco di libri in vendita e http://www.bookstore.com/books/0321396855/ per i dettagli su un particolare libro con ISBN 0321396855. Ciò contrasta con le applicazioni incentrate sull'azione, solitamente con URL lunghi e difficili da crittografare che descrivono le azioni da eseguire, come http://www.bookstore.com/action/query?t=b&id=11117645532&qp =0321396855 . I parametri di query vengono utilizzati per selezionare i dati richiesti. Utilizzando l'esempio della libreria, specificando il parametro subject si restringe l'oggetto del libro. Ad esempio, fisica o gialli, o ad esempio l'URL http://www.bookstore.com/books/?subject=computers/eclipse - una richiesta che restituisce un elenco di libri sulla piattaforma Eclipse.

Il termine REST è stato coniato da Roy Fielding nella sua tesi di dottorato. Considerava i collegamenti ipertestuali come un mezzo per modificare (memorizzare) lo stato di un'applicazione. I collegamenti ipertestuali sono memorizzati nelle risorse dell'applicazione e sono un metodo per modificare lo stato dell'applicazione, reindirizzando da uno stato all'altro. Di solito i collegamenti ipertestuali in (X)HTML sono destinati all'uso umano, non sono stati utilizzati in XML, che era destinato all'elaborazione automatica. Proprio come (X)HTML, i servizi Web REST utilizzano collegamenti ipertestuali in XML.

Le applicazioni Web tradizionali accedono alle risorse tramite operazioni HTTP GET o POST. Le applicazioni RESTfull funzionano con le risorse in stile "crea, leggi, aggiorna ed elimina (CRUD)" utilizzando complete Funzionalità HTTP protocollo (POST, GET, PUT e DELETE).

Altro nota importante sull'applicazione REST: le applicazioni RESTful dovrebbero essere stateless. Ciò significa che l'applicazione REST non memorizza alcuno stato della sessione sul lato server. Tutte le informazioni necessarie per soddisfare una richiesta vengono passate nella richiesta stessa. (Pertanto, il server deve rispondere alle richieste ripetute allo stesso modo, ndr). Di conseguenza, il client può memorizzare nella cache le risorse ricevute, il che può accelerare notevolmente la velocità dell'applicazione laddove il servizio lo consenta esplicitamente. Per ulteriori informazioni su REST, vedere i collegamenti all'articolo.

WSDL e RIPOSO

Il WSDL contiene tutti i dettagli sul servizio web, tra cui:

    URL del servizio web
    Meccanismi di comunicazione che il servizio Web comprende
    Operazioni che un servizio Web può eseguire
    Struttura del messaggio del servizio Web

I clienti possono utilizzare i dettagli elencati per interagire con il servizio.

WSDL 2.0 è stato dichiarato una raccomandazione W3C nel giugno 2007. Questa versione dello standard WSDL è stata rilasciata per risolvere problemi nello standard WSDL 1.1, molti dei quali sono stati scoperti da Web Services Interoperability (WS-I). Inoltre, WSDL 2.0 ha migliorato il supporto per i collegamenti HTTP.

Lo stesso WSDL è XML, un sottoinsieme che descrive formalmente un servizio web. Pensa alla descrizione WSDL di un servizio Web come al suo contratto API con il client. Il WSDL specifica l'indirizzo, i metodi di comunicazione validi, l'interfaccia e i tipi di messaggio del servizio Web. In breve, la descrizione WSDL contiene tutte le informazioni di cui un client ha bisogno per utilizzare un servizio web.

L'applicabilità di WSDL va oltre il suo utilizzo come contratto API. Essendo una definizione formale, WSDL può essere utilizzato da software che semplifica l'implementazione di servizi Web per operazioni quali:

  • Generazione codice sorgente applicazione client e server per un servizio Web in diversi linguaggi di programmazione
  • Pubblicazione di un servizio Web
  • Test del servizio Web dinamico

Maggioranza strumenti software per lavorare con i servizi web includono il supporto per WSDL 1.1. Tempi recenti esiste un numero crescente di strumenti di sviluppo di servizi Web che supportano WSDL 2.0. Progetto Web Apache services consiste di due sottoprogetti che attualmente supportano WSDL 2.0. Woden è un parser WSDL 2.0 basato su Java. Il progetto dei servizi Web Apache fornisce anche una trasformazione XSL (XSLT) WSDL 2.0 chiamata Bella stampante WSDL 2.0, che fornisce una migliore leggibilità umana del documento WSDL. Axis2 è un popolare motore di servizi Web (anch'esso di Apache) che genera codice Java client e server da un documento WSDL 2.0.

Descrizione di un servizio Web REST utilizzando WSDL 2.0

Stai creando una libreria con un URL promosso: http://www.bookstore.com . Hai già creato due servizi Web REST:

  • lista di libri- il servizio riceve un elenco di libri venduti da te.
  • dettagli del libro: il servizio riceve informazioni su un libro specifico.

La risposta viene restituita nei documenti XML.

Elemento interfaccia definisce un elenco di operazioni del servizio Web, inclusa una descrizione dell'input, dell'output e dei messaggi di errore per le operazioni, nonché l'ordine in cui vengono passati.

Elemento legame definisce i mezzi di comunicazione tra il client e il servizio web. Nel caso dei servizi Web REST, HTTP è specificato come mezzo di comunicazione.

L'elemento di servizio associa gli indirizzi dei servizi Web a specifiche interfacce (interfaccia) e mezzi di comunicazione (binding). (ovvero corrisponde all'URL dell'operazione del servizio Web e all'elemento legame).

Associare l'elenco dei libri a HTTP

Elemento legame specifica l'associazione di un servizio Web a uno specifico protocollo di trasferimento dati. Per associare il servizio elenco libri a HTTP, è necessario specificare il valore http://www.w3.org/ns/wsdl/http per l'attributo genere elemento legame.

Elemento legame può facoltativamente fare riferimento a interfaccia. Lascia l'attributo interfaccia vuoto. Lo creerai dentro sezione successiva. Se una interfaccia Associato a legame, poi legame un elemento può facoltativamente definire un elemento figlio operazione, che è uno specchio per funzionamento dell'interfaccia elemento. Devi creare uno stub dell'elemento operazione e completare il collegamento operazione successivamente dopo la creazione interfaccia.

Esistono 4 metodi di comunicazione HTTP

  • ELIMINA

Il servizio Elenco libri legge la richiesta e opera di conseguenza con un HTTP GET. Installare Metodo GET per l'elemento operation utilizzando l'attributo method dallo spazio dei nomi HTTP WSDL 2.0. Per utilizzare questo attributo, devi prima definire lo spazio dei nomi http://www.w3.org/ns/wsdl/http sull'elemento descrizione.

Elenco libri Il servizio di rilegatura è definito nel seguente elenco. Specifica ora legame nell'elemento punto finale:tns:BookListHTTPBinding.

Il servizio elenco libri della libreria.

Definizione di funzionamento del servizio di elenchi di libri

Finora hai imparato come affrontare e comunicare con il servizio web elenco libri. Successivamente si specifica l'operazione del servizio elenco libri, che descrive cosa il il servizio di elenchi di libri lo fa.

Quindi, hai imparato come impostare l'indirizzo e impostare l'associazione (metodo di comunicazione) per il servizio web. Successivamente, è necessario definire un'operazione di servizio che definisca cosa fa il servizio Web dell'elenco dei libri.

L'elemento interfaccia e il relativo elemento operazione figlio vengono utilizzati per definire le operazioni del servizio. Nel caso di un elenco di libri, definisci un'unica operazione getBookList che restituisce un elenco di libri.

Quindi definire tre attributi sull'elemento operazione:

modello

Utilizzato per specificare il modello di scambio dei messaggi modello di scambio di messaggi(MEP) per l'operazione. MEP definisce la sequenza dei messaggi per un'operazione e la loro direzione. In questo caso, è necessario specificare il valore http://www.w3.org/ns/wsdl/in-out per indicare che il servizio Web riceve un messaggio di input che richiede un elenco di libri e invia un messaggio di output con un elenco di libri. Per sostenere questo eurodeputato, specificare elementi figlio ingresso e produzione per elemento operazione. Questi elementi utilizzano gli elementi descritti nello schema XML per definire le strutture dei messaggi. Dettagli nella prossima sezione.

stile

Usato per indicare Informazioni aggiuntive Sul lavoro. Specificare il valore http://www.w3.org/ns/wsdl/style/iri , che impone restrizioni sul contenuto degli elementi di input, ad esempio richiedendo che utilizzi solo elementi dello schema XML.

wsdlx:sicuro

wsdlx:safe: dallo spazio dei nomi delle estensioni WSDL, questo attributo dichiara che questa operazione è idempotente. Questo tipo di operazione non modifica la risorsa e può quindi essere richiamata più volte con gli stessi risultati. Per utilizzare questo elemento, dichiarare lo spazio dei nomi delle estensioni WSDL http://www.w3.org/ns/wsdl-extensions sull'elemento descrizione.

Questo attributo proviene dallo spazio dei nomi delle estensioni WSDL. Specifica che l'operazione è idempotente. Questa operazione non modifica la risorsa, quindi può essere richiamata più volte con gli stessi risultati. Per utilizzare questo elemento, è necessario dichiarare le estensioni WSDL dello spazio dei nomi http://www.w3.org/ns/wsdl-extensions nell'elemento radice (l'elemento descrizione).

È possibile trovare i modelli di scambio di messaggi predefiniti, gli stili e le definizioni di wsdlx:safe in WSDL 2.0 Parte 2: Aggiunte

Di seguito è riportata la definizione del servizio elenco libri con aggiunta di descrizione interfaccia. Dopo aver aggiunto un'interfaccia, è ora possibile modificare l'elemento dell'operazione di associazione per specificare i collegamenti a quanto descritto interfaccia e operazione.

L'associazione HTTP RESTful per il servizio elenco libri. Il servizio elenco libri della libreria.

Definizione dei messaggi operativi dell'elenco libri

Il servizio Web dell'elenco dei libri utilizza due messaggi: input e output. È necessario descrivere le strutture di questi messaggi in modo che i programmi client sappiano cosa inviare all'indirizzo del servizio e cosa aspettarsi in risposta.

WSDL 2.0 supporta più sistemi di tipo per descrivere il contenuto del messaggio, ma lo schema XML è l'unico in uso. Questa sezione non copre i dettagli dello schema XML. Lo schema XML è utilizzato in molte altre applicazioni, come WSDL 1.1, e ci sono molti buoni articoli a riguardo. Questa sezione illustra come utilizzare lo schema XML per il servizio Web REST dell'elenco di libri e come utilizzare attributi aggiuntivi definiti da WSDL 2.0 per annotare un attributo dello schema.

WSDL 2.0 supporta molti sistemi di definizione dei tipi, ma in pratica viene utilizzato solo lo schema XML. Questo articolo non entra nei dettagli dello schema XML. Lo schema XML è utilizzato in molte altre applicazioni come WSDL 1.1 e ce ne sono molte buoni articoli su di lui. (). Questa sezione dimostra, applicazione dell'XML schema applicato a esempio specifico REST del servizio elenco libri, nonché l'uso di attributi aggiuntivi definiti in WSDL 2.0 per l'annotazione degli attributi dello schema.

Per descrivere 2 messaggi per l'elenco dei libri, devi descrivere 2 elementi globali.

  • getBookList rappresenta il messaggio di input. Contiene una sequenza di elementi, incluso ogni parametro di query consentito per il servizio: autore, titolo, editore, soggetto e linguaggio. All'interno del messaggio getBookList, possono essere utilizzati solo elementi perché lo stile IRI è scelto per il funzionamento dell'interfaccia.
  • lista di libri rappresenta il messaggio di output. Contiene una sequenza di elementi del libro. Ogni elemento del libro a sua volta contiene gli attributi title e url. L'attributo title si spiega da sé. L'attributo url è un collegamento al servizio dettagli libro che restituisce informazioni dettagliate su un particolare libro.

La definizione dell'attributo url utilizza a sua volta 2 attributi dallo spazio dei nomi delle estensioni WSDL. Gli attributi wsdlx:interface e wsdlx:binding specificano l'interfaccia e l'associazione per il servizio. Software può utilizzare queste informazioni per ritrovamento automatico servizio. Per utilizzare questi attributi, specificare lo spazio dei nomi delle estensioni WSDL per l'elemento schema. Includere anche lo spazio dei nomi dei dettagli del libro dalla sua descrizione WSDL 2.0.

Di seguito è riportato lo schema XML per il servizio di elenchi di libri.

L'elemento di richiesta per il servizio elenco libri. L'elemento di risposta per il servizio elenco libri.

Per fare riferimento agli elementi di input e output, è necessario importare lo schema nel documento WSDL. Per importare uno schema, utilizzare l'elemento di importazione dello schema nella sezione dei tipi, come mostrato nell'elenco seguente. Inoltre, è necessario aggiungere riferimenti agli elementi getBookList e Booklist negli elementi di input e output dell'operazione di interfaccia e aggiungere gli spazi dei nomi dello schema XML dell'elenco di libri all'elemento radice WSDL.

WSDL pronto per il servizio Web dell'elenco dei libri.

Questa è una descrizione WSDL 2.0 di un servizio di libreria di esempio per ottenere informazioni sui libri. Questa operazione restituisce un elenco di libri. L'associazione HTTP RESTful per il servizio elenco libri. Il servizio elenco libri della libreria.

Nota del traduttore

Mi sono preso la libertà di non tradurre sintesi e link. Entrambi guardano l'autore. nell'articolo originale. Devo dire che la lingua originale è molto pesante. Tuttavia, spero che l'articolo sia utile.

In questo articolo parlerò di cos'è un file WSDL, perché ne hai bisogno e come lavorarci.

Mappa dell'articolo

Che cos'è WSDL

WSDL è un linguaggio di descrizione del servizio Web che ha una struttura XML. Lo scopo principale di un file WSDL è fornire un'interfaccia per l'accesso alle funzioni di servizio restituite dai tipi di dati; percorso del server che elabora le richieste, ecc.

Il percorso del file wsdl è in genere http://host/services/wsdl/gbdar-v2-2.wsdl

Esistono molti strumenti, librerie, progettati per leggere il file WSDL.

SoapUi

Uno di questi strumenti è soapUi(). Dopo aver installato il kit di distribuzione pensato per la tua piattaforma, puoi creare un nuovo progetto con il comando File/Nuovo progetto SoapUi. Nella finestra di dialogo per la creazione di un nuovo progetto, lasciare selezionata la casella di controllo Crea richieste di esempio

Esecuzione di query

Il nuovo progetto genererà automaticamente modelli di richiesta per il servizio descritto nel file wsdl. Sul lato sinistro dell'albero vedrai un elenco di funzioni contenute nel file WSDL. Espanderò la funzione di replica. Al suo interno c'è una richiesta Request1, facendo doppio clic sulla quale, vedremo una finestra di dialogo con un modello di richiesta, invece dei parametri predefiniti, verranno messi dei punti interrogativi. Affinché la funzione venga eseguita correttamente, è necessario compilare tutti i parametri che non sono contrassegnati dal tag Optional, quindi fare clic sul triangolo verde nell'angolo in alto a sinistra della finestra di dialogo.

Se tutti i parametri sono corretti, sulla destra comparirà la risposta del servizio alla richiesta.

SoapUi offre la possibilità di visualizzare i parametri del file WSDL, per questo è necessario fare doppio clic sul nome dell'interfaccia (contrassegnato da un'icona verde nell'albero del file WSDL, ho gdbar-v2-2SOAP). Nella finestra di dialogo puoi trovare:

  • Scheda Panoramica - una descrizione dei parametri generali del WSDL, un elenco di funzioni e relative azioni del server
  • Scheda Endpoint del servizio - percorso del server e altri parametri
  • contenuto .wsdl albero di navigazione dei file
  • Conformità WS-I - qui puoi creare un rapporto di interfaccia WS-I

Generazione di documenti

SoapUi ci consente di generare documentazione per le funzioni WSDL. Per fare ciò, fare clic con il tasto destro sull'interfaccia e chiamare il comando Genera documentazione. Di conseguenza, otteniamo un manuale dettagliato in formato html.

Questo è tutto, iscriviti a nuove voci, lascia commenti, dai suggerimenti per migliorare l'articolo.

Principali articoli correlati