standalone servicio example enviar consumir cliente java spring web-services soap jaxb

java - servicio - ¿Cómo enviar una solicitud SOAP usando WebServiceTemplate?



soap java example (4)

Aquí hay un ejemplo de lo que debería estar buscando

El jabón tiene muchas restricciones a diferencia de REST . Sigue algunos estándares que deben cumplirse antes de que la llamada de red funcione,

Pero a diferencia de Rest , en Soap si tiene una URL WSDL puede obtener toda la información necesaria para llamar a la llamada 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";

este código fue escrito en Android para que pueda ignorar alguna parte de él, pero aún así lo mantuve en respuesta para que alguien con experiencia en Android pueda darle un buen uso

Abra [WSDL][1] en el navegador y verifique las cosas importantes para llamar a un método remoto en el servidor.

1 verá un atributo targetNamespace cuyo valor sería Namespace que utilizará en este caso Namespace es http://www.w3schools.com/webservices/

2 Ahora necesita el nombre del método que este WSDL tiene cuatro métodos, cada uno de los cuales son atributos int s:element con el valor es el nombre del Método; en este caso, cuatro métodos son FahrenheitToCelsius , FahrenheitToCelsiusResponse , CelsiusToFahrenheit , CelsiusToFahrenheitResponse

3 Ahora tiene que descubrir la SOAP Action que es NAMESPACE+METHOD pero WSDL también brinda información sobre eso, busque la etiqueta soap:operation y su atributo soapAction tiene la acción Soap como su valor en este caso que queremos la llamada es http://www.w3schools.com/webservices/CelsiusToFahrenheit

private class MyTask extends AsyncTask<Void, Void, String> { @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); } }

Estoy tratando de enviar una solicitud a un servicio web SOAP. Leí este tutorial y preparé el siguiente código. Sin embargo, voy a enviar diferentes solicitudes a múltiples servicios web SOAP, mientras que el tutorial se centró en una solicitud. ¿Cómo puedo enviar una solicitud 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());


Asumiendo que su SoapMessage es marhsallable

Para enviar el mismo mensaje a múltiples puntos finales, solo necesita recorrer el código de envío y el controlador de solicitud.

Algo como esto:

{ 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. }

Este código usa Spring WebServiceTemplate


Para enviar diferentes solicitudes SOAP a diferentes servicios SOAP, solo necesita informar a su WebServiceTemplate de todas las solicitudes y respuestas que tendrá que procesar.

Cree una clase Java para cada solicitud y respuesta de esta manera:

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; } }

(El @XmlRootElement se debe a que usamos el calificador JAXB a continuación; consulte la referencia de Jaxb para obtener más información).

La configuración de la plantilla se realiza, por ejemplo, así:

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();

"modelos" es el nombre del paquete donde están las clases de Solicitud / Respuestas, para que jaxb pueda encontrarlas.

Luego, solo crea una instancia de la solicitud de la clase en la que desea realizar la llamada, así:

// 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);

Del mismo modo, puede convertir los objetos de respuesta en sus clases JAXB definidas anteriormente.


Puede usar el siguiente código, no necesita definir nada en el archivo 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(); }