How to send a SOAP request using WebServiceTemplate?

前端 未结 5 793
温柔的废话
温柔的废话 2020-11-30 07:50

I am trying to send a request to a SOAP webservice. I read this tutorial and prepared the following code. However, I am going to send different requests to multiple SOAP web

相关标签:
5条回答
  • 2020-11-30 07:59

    Assuming that your SoapMessage is marhsallable

    To send the same message to multiple endpoints you only need to loop on the sending code and the request handler.

    Something like this:

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

    This code uses the Spring WebServiceTemplate

    0 讨论(0)
  • 2020-11-30 08:02

    I tried many options and finally below one worked for me if you have to send soap header with authentication(Provided authentication object created by wsimport) and also need to set soapaction.

    public Response callWebService(String url, Object request)
    
    {
        Response res = null;
        log.info("The request object is " + request.toString());
    
        try {
            
            
    
            res = (Response) getWebServiceTemplate().marshalSendAndReceive(url, request,new WebServiceMessageCallback() {
                     @Override
                      public void doWithMessage(WebServiceMessage message) {
                        try {
                          // get the header from the SOAP message
                          SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
    
                          // create the header element
                          ObjectFactory factory = new ObjectFactory();
                          Authentication auth =
                              factory.createAuthentication();
                          auth.setUser("****");
                          auth.setPassword("******");
                         ((SoapMessage) message).setSoapAction(
                                    "soapAction");
    
                          JAXBElement<Authentication> headers =
                              factory.createAuthentication(auth);
    
                          // create a marshaller
                          JAXBContext context = JAXBContext.newInstance(Authentication.class);
                          Marshaller marshaller = context.createMarshaller();
    
                          // marshal the headers into the specified result
                          marshaller.marshal(headers, soapHeader.getResult());
                          
                        } catch (Exception e) {
                          log.error("error during marshalling of the SOAP headers", e);
                        }
                      }
                    });
    
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    
    }
    
    0 讨论(0)
  • 2020-11-30 08:05

    To send different SOAP requests to different SOAP services, you just need to make your WebServiceTemplate aware of all requests and responses it will have to process.

    Create a Java class for each request and response like so:

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

    (The @XmlRootElement is because we use JAXB marshaller below; see Jaxb reference for more info).

    The setup of the template is done for example like so:

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

    "models" is the name of the package where the Request/Responses classes are, so that jaxb can find them.

    Then you just instantiate the request of the class you want to perform the call, like so:

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

    Similarly, you can cast the response objects into your JAXB classes defined above.

    0 讨论(0)
  • 2020-11-30 08:17

    You can use following code, you do not need to define anything in xml file.

      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();
            }
    
    0 讨论(0)
  • Here is an Example what you should be looking for

    Soap has a lot of restriction unlike REST, It follows some standards which have to be meet before you get Network call to work,

    But unlike Rest, in Soap if you have WSDL URL you can get all the information needed to call the Soap call

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

    this code was written in Android so you can ignore some part of it but I still kept it in answer so someone from android background can put a good use to it

    Open [WSDL][1] in browser and check for the things which matter to call a remote method on server.

    1 you will see an attribute targetNamespace whose value would be Namespace which you will use in this case Namespace is http://www.w3schools.com/webservices/

    2 Now you require the name of the method this WSDL has four method each of the are int attribute s:element with the value is the name of the Method in this case four methods are FahrenheitToCelsius, FahrenheitToCelsiusResponse, CelsiusToFahrenheit, CelsiusToFahrenheitResponse

    3 Now you have to fure out the SOAP Action which is NAMESPACE+METHOD but WSDL also gives information about that as well, look for the tag soap:operation and it's soapAction attribute havs the Soap action as it's value in this case which we want to call is 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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题