Generate soap request using Camel

18,357

Solution 1

I Changed my code as following now it works fine but i think i am not using camel properly

so help me to improve generate soap request using camel without writing any java code.

package com.camel.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.cxf.DefaultCxfBinding;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.apache.camel.impl.DefaultCamelContext;

public class CamelViralTest {
    static CamelContext context;

    public static void main(String args[]) throws Exception {
        CamelContext context = new DefaultCamelContext();
        ProducerTemplate template = context.createProducerTemplate(0);

        context.start();
        String url = "cxf://http://localhost:8081/buzzor-service/services/ApplicationService?"
                + "wsdlURL=http://localhost:8081/buzzor-service/services/ApplicationService?wsdl&"
                + "serviceName={http://service.application.buzzor.atpl.com}ApplicationService&"
                + "portName={http://service.application.buzzor.atpl.com}ApplicationServiceHttpPort"
        +"&dataFormat=MESSAGE";
        Exchange e=sendSimpleMessage1(template,url);
        System.out.println(e.getOut().getBody());
        Thread.sleep(10000);
        context.stop();
    }

    private static Exchange sendSimpleMessage1(ProducerTemplate template,
            String endpointUri) {

        final List<String> params = new ArrayList<String>();
        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put(CxfConstants.OPERATION_NAME, "getApplication");
        headers.put("requestObject", new DefaultCxfBinding());
        params.add("hello world");

        Exchange exchange = template.request(endpointUri, new Processor() {
            public void process(final Exchange exchange) throws Exception {
                SOAPMessage soapMessage=createSOAPRequest();
                exchange.getIn()
                        .setBody(  soapMessage.getSOAPBody());
            }
        });
        return exchange;

    }

    private static SOAPMessage createSOAPRequest() throws Exception {
         MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage soapMessage = messageFactory.createMessage();
            SOAPPart soapPart = soapMessage.getSOAPPart();

            String serverURI = "http://ws.cdyne.com/";

            // SOAP Envelope
            SOAPEnvelope envelope = soapPart.getEnvelope();
            envelope.addNamespaceDeclaration("example", serverURI);

            javax.xml.soap.SOAPBody soapBody = envelope.getBody();
            SOAPElement soapBodyElem = soapBody.addChildElement("getApplication", "example");
           /* SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("data", "example");
            soapBodyElem1.addTextNode("[email protected]");*/
            MimeHeaders headers = soapMessage.getMimeHeaders();
            headers.addHeader("SOAPAction", serverURI  + "getApplication");

            soapMessage.saveChanges();

            /* Print the request message */
            System.out.print("Request SOAP Message = ");
            soapMessage.writeTo(System.out);
            System.out.println();

            return soapMessage;
    }
}

Solution 2

If you were using a JAXB entity instead of a String you could use the SOAP data format to marshal it into a SOAP envelope. From that page...

<route>
  <from uri="direct:start"/>
  <marshal>
     <soapjaxb contentPath="com.example.customerservice" version="1.2" elementNameStrategyRef="myNameStrategy"/>
  </marshal>
  <to uri="jms:myQueue"/>
</route>

Generally it is ill advised to hand write your XML as it's very error prone and you can't make use of these handy features. You'll also find it difficult to use any of the expression languages other than XPath against the plain string.

Share:
18,357
Darshan Patel
Author by

Darshan Patel

Don't waste a good mistake... Learn from it.

Updated on June 04, 2022

Comments

  • Darshan Patel
    Darshan Patel almost 2 years

    I want to call third party webservice from camel using wsdl file without any generating client code(because i think if i am providing wsdl file then camel able to generate client that we previously generate and that's working in our older code)

    After searching long time i found some code that helps me to achieve my goal

    code is

    import org.apache.camel.CamelContext;
    import org.apache.camel.Exchange;
    import org.apache.camel.Processor;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.dataformat.soap.Soap11DataFormatAdapter;
    import org.apache.camel.dataformat.soap.Soap12DataFormatAdapter;
    import org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy;
    import org.apache.camel.impl.DefaultCamelContext;
    import org.apache.camel.model.dataformat.SoapJaxbDataFormat;
    
    import com.camel.model.Application;
    public class TestMain {
        static CamelContext context;
    
        public static void main(String args[]) throws Exception {
            CamelContext context = new DefaultCamelContext();
            ProducerTemplate template = context.createProducerTemplate(0);
            context.start();
            String url="cxf://http://localhost:8081/buzzor-service/services/ApplicationService?" +
              "wsdlURL=http://localhost:8081/buzzor-service/services/ApplicationService?wsdl&" +
              "serviceName={http://service.application.buzzor.atpl.com}ApplicationService&" +
              "portName={http://service.application.buzzor.atpl.com}ApplicationServiceHttpPort&" +
              "dataFormat=MESSAGE";
            Exchange reply = sendSimpleMessage(template, url);
            org.apache.camel.Message out = reply.getOut();
            String result = out.getBody(String.class);
    
            System.out.println(result);
            Thread.sleep(10000);
            context.stop();
        }
    
        private static Exchange sendSimpleMessage(ProducerTemplate template,
                String endpointUri) {
    
    
            Exchange exchange = template.request(endpointUri, new Processor() {
                public void process(final Exchange exchange) throws Exception {
    
                    exchange.getIn().setBody("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                             + "<soap:Body><ns1:getApplication xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
    //                         + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">hello world</arg0>"
                             + "</ns1:getApplication></soap:Body></soap:Envelope>");
    
    
                     System.out.println(exchange.getIn().getBody());
                }
            });
            return exchange;
        }
    }
    

    this works correctly but here i am manually generate soap Envelop

    wsdl file is

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://service.application.buzzor.atpl.com" xmlns:ns1="urn:http://model.application.buzzor.atpl.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://service.application.buzzor.atpl.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.application.buzzor.atpl.com">
    <xsd:element name="getApplication">
    <xsd:complexType/>
    </xsd:element>
    <xsd:element name="getApplicationResponse">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    <xsd:element name="addApplication">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="ns1:Application"/>
    <xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="ns1:User"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    <xsd:element name="addApplicationResponse">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="ns1:ApplicationResult"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    </xsd:schema>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:http://model.application.buzzor.atpl.com">
    <xsd:complexType name="Application">
    <xsd:sequence>
    <xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="APP_PASSWORD" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="APP_TYPE" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="APP_VERSION" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="EXCEPTION_HANDLED" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="IS_LOGIN_REQUIRED" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="LONG_CODES" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="PREVIOUS_NODE_KEY" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="REPLY_TEXT" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="WELCOME_NOTE" nillable="true" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="User">
    <xsd:sequence>
    <xsd:element minOccurs="0" name="ACTIVE_STATUS" type="xsd:int"/>
    <xsd:element minOccurs="0" name="CUSTOMER_ID" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="FIRST_NAME" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="IS_ADMIN" type="xsd:int"/>
    <xsd:element minOccurs="0" name="LAST_NAME" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="LOGIN_USER_ID" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="LOGIN_ALLSC" type="xsd:int"/>
    <xsd:element minOccurs="0" name="USER_ACTION" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="USER_CONFIRM_PASSWORD" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="USER_ID" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="USER_PASSWORD" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="USER_PATH" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="USER_STATUS" type="xsd:int"/>
    <xsd:element minOccurs="0" name="USER_TYPE" type="xsd:boolean"/>
    <xsd:element minOccurs="0" name="VERSION_ID" type="xsd:double"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="ApplicationResult">
    <xsd:sequence>
    <xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
    <xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="ERROR_MESSAGE" nillable="true" type="xsd:string"/>
    <xsd:element minOccurs="0" name="ERROR_STATUS" nillable="true" type="xsd:int"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:schema>
      </wsdl:types>
      <wsdl:message name="addApplicationRequest">
        <wsdl:part name="parameters" element="tns:addApplication">
        </wsdl:part>
      </wsdl:message>
      <wsdl:message name="addApplicationResponse">
        <wsdl:part name="parameters" element="tns:addApplicationResponse">
        </wsdl:part>
      </wsdl:message>
      <wsdl:message name="getApplicationResponse">
        <wsdl:part name="parameters" element="tns:getApplicationResponse">
        </wsdl:part>
      </wsdl:message>
      <wsdl:message name="getApplicationRequest">
        <wsdl:part name="parameters" element="tns:getApplication">
        </wsdl:part>
      </wsdl:message>
      <wsdl:portType name="ApplicationServicePortType">
        <wsdl:operation name="getApplication">
          <wsdl:input name="getApplicationRequest" message="tns:getApplicationRequest">
        </wsdl:input>
          <wsdl:output name="getApplicationResponse" message="tns:getApplicationResponse">
        </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="addApplication">
          <wsdl:input name="addApplicationRequest" message="tns:addApplicationRequest">
        </wsdl:input>
          <wsdl:output name="addApplicationResponse" message="tns:addApplicationResponse">
        </wsdl:output>
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="ApplicationServiceHttpBinding" type="tns:ApplicationServicePortType">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="getApplication">
          <wsdlsoap:operation soapAction=""/>
          <wsdl:input name="getApplicationRequest">
            <wsdlsoap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="getApplicationResponse">
            <wsdlsoap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="addApplication">
          <wsdlsoap:operation soapAction=""/>
          <wsdl:input name="addApplicationRequest">
            <wsdlsoap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="addApplicationResponse">
            <wsdlsoap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="ApplicationService">
        <wsdl:port name="ApplicationServiceHttpPort" binding="tns:ApplicationServiceHttpBinding">
          <wsdlsoap:address location="http://localhost:8081/buzzor-service/services/ApplicationService"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    

    now i want to generate soap request rather that static

    please help me

    Thanks in advance