Come inviare una richiesta SOAP utilizzando WebServiceTemplate?

Sto tentando di inviare una richiesta a un servizio web SOAP. Ho letto questo tutorial e ho preparato il seguente codice. Tuttavia, invierò richieste diverse a più servizi Web SOAP, mentre il tutorial si concentra su una richiesta. Come posso inviare una richiesta SOAP usando WebserviceTemplate ?

WebServiceTemplate

  SoapMessage soapMsg = new SoapMessage(); soapMsg.setUsername("Requester"); soapMsg.setPassword("Pass"); soapMsg.setLanguageCode("EN"); Request request = new Request(); request.setDeparture("FDH"); request.setDestination("HAM"); Date date = new Date(); SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd"); request.setDepartureDate(frm2.parse(frm2.format(date))); request.setNumADT(1); request.setNumCHD(0); request.setNumInf(0); request.setCurrencyCode("EUR"); request.setWaitForResult(true); request.setNearByDepartures(true); request.setNearByDestinations(true); request.setRronly(false); request.setMetaSearch(false); soapMsg.setRequest(request); WebServiceTemplate webServiceTemplate = new WebServiceTemplate(). //how to create object and send request! Object response = webServiceTemplate.marshalSendAndReceive( "https://aaa5.elsyarres.net", soapMsg); Response msg = (Response) response; System.err.println("size of results of wogolo:" + msg.getFlights().getFlight().size()); 

È ansible utilizzare il seguente codice, non è necessario definire nulla nel file xml.

  try { SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory( MessageFactory.newInstance()); messageFactory.afterPropertiesSet(); WebServiceTemplate webServiceTemplate = new WebServiceTemplate( messageFactory); Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("PACKAGE"); marshaller.afterPropertiesSet(); webServiceTemplate.setMarshaller(marshaller); webServiceTemplate.afterPropertiesSet(); Response response = (Response) webServiceTemplate .marshalSendAndReceive( "address", searchFlights); Response msg = (Response) response; } catch (Exception s) { s.printStackTrace(); } 

Per inviare diverse richieste SOAP a diversi servizi SOAP, è sufficiente rendere il proprio WebServiceTemplate consapevole di tutte le richieste e le risposte che dovrà elaborare.

Creare una class Java per ogni richiesta e risposta in questo modo:

 package models; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; @XmlRootElement public class FlyRequest implements Serializable { private boolean nearByDeparture; public FlyRequest() {} public boolean isNearByDeparture() { return nearByDeparture; } public void setNearByDeparture(boolean nearByDeparture) { this.nearByDeparture = nearByDeparture; } } 

(Il @XmlRootElement è perché utilizziamo il marshaller JAXB di seguito, per ulteriori informazioni vedere il riferimento Jaxb).

La configurazione del modello è fatta ad esempio in questo modo:

  SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance()); messageFactory.afterPropertiesSet(); WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory); Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("models"); marshaller.afterPropertiesSet(); webServiceTemplate.setMarshaller(marshaller); webServiceTemplate.afterPropertiesSet(); 

“models” è il nome del pacchetto in cui sono presenti le classi Request / Responses, in modo che jaxb possa trovarli.

Quindi basta istanziare la richiesta della class che si desidera eseguire la chiamata, in questo modo:

  // call fly service: FlyRequest flyRequest = new FlyRequest(); flyRequest.setNearByDeparture(false); Object flyResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/fly", flyRequest); // call purchase service: PurchaseRequest purchaseRequest = new PurchaseRequest(); purchaseRequest.setPrice(100); Object purchaseResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/purchase", purchaseRequest); 

Allo stesso modo, puoi lanciare gli oggetti risposta nelle tue classi JAXB definite sopra.

Supponendo che il tuo SoapMessage sia sostenibile

Per inviare lo stesso messaggio a più endpoint è necessario solo eseguire il ciclo sul codice di invio e sul gestore richieste.

Qualcosa come questo:

 { String endpoint = "https://aaa5.elsyarres.net" WebServiceTemplate webServiceTemplate = new WebServiceTemplate(). webServiceTemplate.setDefaultUri(endpoint); Object response = webServiceTemplate.marshalSendAndReceive(soapMsg); // handle you are response as you are currently doing. // Loop changing the endpoint as you need. } 

Questo codice utilizza Spring WebServiceTemplate

Ecco un esempio di ciò che dovresti cercare

Il soap ha molte restrizioni a differenza di REST , segue alcuni standard che devono essere soddisfatti prima che la chiamata di rete funzioni,

Ma a differenza di Rest , in Soap se hai l’URL WSDL puoi ottenere tutte le informazioni necessarie per chiamare la chiamata Soap

 private final String NAMESPACE = "http://www.w3schools.com/webservices/"; private final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL"; private final String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit"; private final String METHOD_NAME = "CelsiusToFahrenheit"; 

questo codice è stato scritto in Android modo da poterne ignorare una parte, ma l’ho tenuto comunque in risposta in modo che qualcuno di Android possa utilizzarlo

Apri [WSDL][1] nel browser e controlla le cose che contano per chiamare un metodo remoto sul server.

1 vedrai un attributo targetNamespace cui valore sarebbe Namespace che userai in questo caso Namespace è http://www.w3schools.com/webservices/

2 Ora è necessario il nome del metodo questo WSDL ha quattro metodi ciascuno degli attributi sono int s:element con il valore è il nome del metodo in questo caso quattro metodi sono FahrenheitToCelsius , FahrenheitToCelsiusResponse , CelsiusToFahrenheit , CelsiusToFahrenheitResponse

3 Ora devi sfogliare l’ SOAP Action che è NAMESPACE+METHOD ma WSDL fornisce anche informazioni su questo, cerca il tag soap:operation e l’attributo soapAction l’azione Soap come valore in questo caso che vogliamo la chiamata è http://www.w3schools.com/webservices/CelsiusToFahrenheit

 private class MyTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog.show(); } @Override protected String doInBackground(Void... params) { try { SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); soapObject.addProperty("Celsius","12"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE httpTransportSE = new HttpTransportSE(URL); httpTransportSE.call(SOAP_ACTION, envelope); SoapPrimitive soapPrimitive = (SoapPrimitive)envelope.getResponse(); Log.d("TAG", "doInBackground: "+soapPrimitive.toString()); return soapObject.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String aVoid) { super.onPostExecute(aVoid); progressDialog.dismiss(); textView.setText(""+aVoid); } }