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());
19
demandé sur cegas 2015-12-19 09:29:17

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();
        }
15
répondu Daniel Newtown 2016-01-08 10:49:58

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.

8
répondu smarquis 2015-12-23 10:31:39

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

2
répondu Mike Murphy 2016-01-07 14:43:14

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 serait Namespace que vous utiliserez dans ce cas Namespacehttp://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 int s:element avec la valeur est le nom de la Méthode dans ce cas quatre méthodes sont FahrenheitToCelsius,FahrenheitToCelsiusResponse,CelsiusToFahrenheit,CelsiusToFahrenheitResponse

3 Maintenant que vous avez à fure l' SOAP Action qui est NAMESPACE+METHOD mais WSDL donne également des informations à ce sujet ainsi, rechercher la balise soap:operation et soapAction attribut havs l'action Soap comme sa valeur dans ce cas que nous voulons appeler est 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);
    }
}
2
répondu Pankaj Nimgade 2016-03-23 05:28:34