web-dev-qa-db-fra.com

Comment envoyer une demande SOAP en utilisant WebServiceTemplate?

J'essaye d'envoyer une demande à un SOAP webservice. J'ai lu ce tutoriel et ai préparé le code suivant. Cependant, je vais envoyer différentes demandes à plusieurs = SOAP webservices, alors que le tutoriel était axé sur une seule demande. 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());
21
Jack

Vous pouvez utiliser le code suivant, vous n'avez pas besoin de définir quoi que ce soit dans un 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();
        }
16
Daniel Newtown

Pour envoyer différents SOAP requêtes à différents SOAP services, vous devez simplement informer votre WebServiceTemplate de toutes les demandes et réponses qu'il devra traiter.

Créez une classe Java pour chaque demande et réponse comme suit:

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

(@XmlRootElement est dû au fait que nous utilisons JAXB marshaller ci-dessous; reportez-vous à la référence Jaxb pour plus d'informations).

La configuration du modèle se fait 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 du paquet contenant les classes Request/Responses, afin que jaxb puisse les trouver.

Ensuite, il vous suffit d’instancier la requête de la classe sur laquelle vous souhaitez effectuer l’appel, comme suit:

    // 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 convertir les objets de réponse dans les classes JAXB définies ci-dessus.

8
smarquis

Voici un exemple de ce que vous devriez rechercher

Le savon a beaucoup de restrictions à la différence de REST, il suit certaines normes qui doivent être respectées avant que vous obteniez un appel réseau au travail,

Mais contrairement à Rest, dans Soap, si vous avez WSDL URL, vous pouvez obtenir toutes les informations nécessaires pour appeler l'appel de 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 en Android afin que vous puissiez en ignorer une partie, mais je l’ai toujours gardé en réponse afin que quelqu'un de Android de fond puisse la mettre à bon escient

Ouvrir [WSDL][1] dans le navigateur et recherchez les éléments importants pour appeler une méthode distante sur le serveur.

1 vous verrez un attribut targetNamespace dont la valeur serait Namespace que vous utiliserez dans ce cas Namespace est http://www.w3schools.com/webservices/

2 Maintenant, vous avez besoin du nom de la méthode this WSDL a quatre méthodes, chacune de ses attributs 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, vous devez vous procurer le SOAP Action lequel est NAMESPACE+METHOD mais WSDL fournit également des informations à ce sujet également, recherchez la balise soap:operation et c'est soapAction attribut a l'action Soap car 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
Pankaj Nimgade

En supposant que votre message SoapMessage soit acceptable

Pour envoyer le même message à plusieurs ordinateurs d'extrémité, il vous suffit de lire en boucle le code d'envoi et le gestionnaire de demandes.

Quelque chose comme ça:

{
    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 Spring WebServiceTemplate

2
Mike Murphy