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íaNamespace
que utilizará en este casoNamespace
eshttp://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 ints:element
con el valor es el nombre del Método; en este caso, cuatro métodos sonFahrenheitToCelsius
,FahrenheitToCelsiusResponse
,CelsiusToFahrenheit
,CelsiusToFahrenheitResponse
3 Ahora tiene que descubrir la
SOAP Action
que esNAMESPACE+METHOD
pero WSDL también brinda información sobre eso, busque la etiquetasoap:operation
y su atributo soapAction tiene la acción Soap como su valor en este caso que queremos la llamada eshttp://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();
}