Sviluppo di un client dinamico utilizzando le API JAX-WS

Articolo

L'articolo originale è qui

Sviluppo di un client dinamico utilizzando le API JAX-WS

JAX-WS (Java API for XML-Based Web Services) fornisce il supporto per il richiamo dinamico delle operazioni degli endpoint di servizio.

Informazioni su questa attività

JAX-WS fornisce una nuova API del client di distribuzione dinamico che è più generica e offre maggiore flessibilità rispetto alla DII (Dynamic Invocation Interface) basata su JAX-RPC (Java API for XML-based RPC) esistente. L'interfaccia del client di distribuzione, javax.xml.ws.Dispatch, è un client orientato alla messaggistica XML destinato agli sviluppatori XML avanzati che preferiscono lavorare a livello XML utilizzando costrutti XML. Per scrivere un client di distribuzione, occorre avere dimestichezza con le API del client di distribuzione e con i tipi di oggetti supportati, e conoscere le rappresentazioni dei messaggi per il file WSDL (Web Services Description Language) associato.

L'API di distribuzione può inviare i dati in modalità PAYLOAD o MESSAGE. Quando si utilizza la modalità PAYLOAD, il client di consegna è responsabile solo di fornire il contenuto del <soap:Body> e JAX-WS include il payload di input in un elemento <soap:Envelope>. Quando si utilizza la modalità MESSAGE, il client di distribuzione è responsabile di fornire l'intero envelope SOAP.

L'API del client di distribuzione richiede i client delle applicazioni per creare dei messaggi o dei payload come XML e richiede una conoscenza approfondita del messaggio o del payload del messaggio. Il client di distribuzione può utilizzare i collegamenti HTTP quando si utilizzano oggetti Source, oggetti JAXB (Java Architecture for XML Binding) oppure oggetti di origine dati. Il client di consegna supporta i seguenti tipi di oggetti:
javax.xml.transform.Source: utilizzare gli oggetti Source per abilitare i client a utilizzare le API XML direttamente. È possibile utilizzare gli oggetti Source con i collegamenti SOAP e HTTP.
Oggetti JAXB: utilizzare gli oggetti JAXB per consentire ai client di utilizzare gli oggetti JAXB generati da uno schema XML per creare e gestire XML con le applicazioni JAX-WS. Gli oggetti JAXB possono essere utilizzati solo con i collegamenti HTTP e SOAP.
javax.xml.soap.SOAPMessage: utilizzare gli oggetti SOAPMessage per consentire ai client di gestire i messaggi SOAP. È possibile utilizzare solo gli oggetti SOAPMessage con i collegamenti SOAP versione 1.1 o SOAP versione 1.2.
javax.activation.DataSource: utilizzare gli oggetti DataSource per consentire ai client di gestire i messaggi MIME (Multipurpose Internet Mail Extension). Utilizzare DataSource solo con i collegamenti HTTP.
La API Dispatch utilizza il concetto di "generics", introdotti in Java Runtime Environment Versione 5. Per ciascuno dei metodi invoke() sull'interfaccia Dispatch, i "generics" vengono utilizzati per determinare il tipo di restituzione.

Procedura

Determinare se si desidera che il client dinamico invii i dati in modalità PAYLOAD o MESSAGE.
Creare un'istanza di servizio ed aggiungere almeno una porta a essa. La porta trasporta le informazioni sull'indirizzo dell'endpoint di servizio e sul collegamento di protocollo.
Creare un oggetto Dispatch<T> utilizzando il metodo Service.Mode.PAYLOAD o il metodo Service.Mode.MESSAGE.
Configurare le proprietà del contesto di richiesta sull'interfaccia javax.xml.ws.BindingProvider. Utilizzare il contesto di richiesta per specificare delle proprietà aggiuntive quali l'abilitazione dell'autenticazione HTTP o la specifica dell'indirizzo dell'endpoint.
Comporre il messaggio di richiesta per il client dinamico.
Richiamare l'endpoint di servizio con il client di distribuzione in modo sincrono o asincrono.
Elaborare il messaggio di risposta dal servizio.

Risultati

È stato sviluppato un client JAX-WS dinamico utilizzando la API Dispatch. Fare riferimento al capitolo 4, sezione 3 della specifica JAX-WS 2.0 per ulteriori informazioni sull'utilizzo di un client di distribuzione.

Esempio

Il seguente esempio illustra i passi per creare un client di distribuzione e richiamare un endpoint di servizio EchoService di esempio.

	
String endpointUrl = ...;

QName serviceName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoService");
QName portName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoServicePort");
		
/** Creare un servizio ed aggiungere almeno una porta ad esso. **/ 
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);
		
/** Creare una istanza di distribuzione da un servizio.**/ 
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, 
SOAPMessage.class, Service.Mode.MESSAGE);
	
/** Creare la richiesta SOAPMessage. **/
// comporre un messaggio di richiesta
MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

// Creare un messaggio.  Questo esempio funziona con SOAPPART.
SOAPMessage request = mf.createMessage();
SOAPPart part = request.getSOAPPart();

// Ottenere il SOAPEnvelope e gli elementi intestazione e corpo.
SOAPEnvelope env = part.getEnvelope();
SOAPHeader header = env.getHeader();
SOAPBody body = env.getBody();

// Creare il payload di messaggio.
SOAPElement operation = body.addChildElement("invoke", "ns1",
 "http://com/ibm/was/wssample/echo/");
SOAPElement value = operation.addChildElement("arg0");
value.addTextNode("ping");
request.saveChanges();

/** Richiamare l'endpoint del servizio. **/
SOAPMessage response = dispatch.invoke(request);

/** Elaborare la risposta. **/

Labels

java java Delete
jax-ws jax-ws Delete
dynamic dynamic Delete
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.