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. **/
Comments (1)
Jan 18, 2011
Disponibile says:
Di seguito dei link molto utili : http://www.hascode.com/2010/04/create-a-soa...Di seguito dei link molto utili :