Comment envoyer une demande SOAP en utilisant WebServiceTemplate?
j'essaie d'envoyer une demande à un service Web SOAP. J'ai lu ce tutoriel et a préparé le code suivant. Cependant, je vais envoyer différentes requêtes à plusieurs SOAP webservices, alors que le tutoriel portait sur une requête. Comment puis-je envoyer une demande SOAP en utilisant 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());
4 réponses
Vous pouvez utiliser le code suivant, vous n'avez pas besoin de définir quoi que ce soit dans le fichier 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();
}
pour envoyer différentes requêtes SOAP à différents services SOAP, vous avez juste besoin de rendre votre WebServiceTemplate conscient de toutes les requêtes et réponses qu'il devra traiter.
Créer une classe Java pour chaque demande et de la réponse de la sorte:
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;
}
}
(le @ XmlRootElement est parce que nous utilisons JAXB marshaller ci-dessous; voir la référence Jaxb pour plus d'informations).
la configuration du modèle est faite par exemple comme suit:
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();
"modèles" est le nom de le paquet où se trouvent les classes Request/Responses, de sorte que jaxb puisse les trouver.
ensuite vous instanciez juste la requête de la classe que vous voulez exécuter l'appel, comme ceci:
// 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);
de même, vous pouvez lancer les objets de réponse dans les classes JAXB définies ci-dessus.
en supposant que votre SoapMessage est marhsallable
pour envoyer le même message à plusieurs endpoints, vous n'avez qu'à boucler le code d'envoi et le gestionnaire de requête.
quelque Chose comme ceci:
{
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.
}
ce code utilise le WebServiceTemplate Spring
voici un exemple de ce que vous devriez chercher
Soap a beaucoup de restrictions contrairement à REST
, Il suit des normes à respecter avant de vous obtenir de l'appel du Réseau de travail,
mais contrairement à Rest
, dans du savon si vous avez WSDL
URL, vous pouvez obtenir toutes les informations nécessaires à l'appel l'appel 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";
ce code a été écrit dans Android
donc vous pouvez ignorer une partie de celui-ci, mais je l'ai quand même gardé dans la réponse afin que quelqu'un d'android en arrière-plan peut mettre une bonne utilisation de
Ouvrir [WSDL][1]
dans le navigateur et vérifier les choses qui comptent pour appeler une méthode à distance sur le serveur.
1 vous verrez un attribut
targetNamespace
dont la valeur seraitNamespace
que vous utiliserez dans ce casNamespace
http://www.w3schools.com/webservices/
2 Maintenant, vous avez besoin du nom de la méthode cette
WSDL
a quatre méthodes chacune de l'attribut are ints:element
avec la valeur est le nom de la Méthode dans ce cas quatre méthodes sontFahrenheitToCelsius
,FahrenheitToCelsiusResponse
,CelsiusToFahrenheit
,CelsiusToFahrenheitResponse
3 Maintenant que vous avez à fure l'
SOAP Action
qui estNAMESPACE+METHOD
mais WSDL donne également des informations à ce sujet ainsi, rechercher la balisesoap:operation
etsoapAction
attribut havs l'action Soap comme sa valeur dans ce cas que nous voulons appeler esthttp://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);
}
}