簡體   English   中英

使用Camel生成soap請求

[英]Generate soap request using Camel

我想使用wsdl文件從camel調用第三方web服務,而不使用任何生成客戶端代碼(因為我認為如果我提供wsdl文件,那么我們可以生成我們之前生成的客戶端,並且在我們的舊代碼中工作)

經過長時間的搜索,我找到了一些幫助我實現目標的代碼

代碼是

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

這工作正常,但在這里我手動生成肥皂信封

wsdl文件是

<?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>

現在我想生成肥皂請求而不是靜態

請幫我

提前致謝

我改變了我的代碼如下現在它工作正常,但我想我沒有正確使用駱駝

所以幫助我使用camel改進生成soap請求而無需編寫任何java代碼。

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("mutantninja@gmail.com");*/
            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;
    }
}

如果您使用的是JAXB實體而不是String,則可以使用SOAP數據格式將其封送到SOAP信封中。 從那頁...

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

一般來說,建議您手動編寫XML,因為它非常容易出錯而且您無法使用這些方便的功能。 您還會發現很難使用XPath以外的任何表達式語言來處理普通字符串。

1)讓我打電話給你的wsdl文件buzzor.wsdl 將wsdl保存在項目目錄中,如下所示,然后使用wsdl2java插件從wsdl文件生成類。 在你的pom.xml中添加這個。

<build>
<plugins>
    <plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${project.basedir}/src/main/resources/wsdl/buzzor.wsdl</wsdl>
                        <wsdlLocation>classpath:wsdl/buzzor.wsdl</wsdlLocation>
                         <extraargs>
                          <!--this will generate client for you-->
                            <extraarg>-client</extraarg>
                        </extraargs>
                   </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>
</plugins>
</build> 

您將看到生成的類如下。 在此輸入圖像描述

ApplicationServicePortType_ApplicationServiceHttpPort_Client.java是一個示例客戶端,您可以根據需要使用它來編寫自定義客戶端。

在您的情況下,讓我們使用ApplicationServicePortType.java來定義2個方法

a) public java.lang.String getApplication();
b) public http.model_application_buzzor_atpl.ApplicationResult addApplication(...);

2)在spring上下文中配置Jaxws客戶端。

<beans xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <jaxws:client id="applicationService" serviceClass="com.atpl.buzzor.application.service.ApplicationServicePortType" address="http://localhost:8081/buzzor-service/services/ApplicationService" />

3)在您的Camel路線中,您可以調用豆...

@Inject
private SoapUtils soapUtils;
...
from("direct:some-endpoint")
.bean(soapUtils,"invokeWebserviceAndGetResponse")

4)在SoapUtils類中,您可以注入applicationService bean並調用webservice

import com.atpl.buzzor.application.service.ApplicationServicePortType;
import http.model_application_buzzor_atpl.ApplicationResult;
import http.model_application_buzzor_atpl.Application;
import http.model_application_buzzor_atpl.User;
public class SoapUtils {
    @Inject
    private ApplicationServicePortType applicationService;

    public void invokeWebserviceAndGetResponse(Exchange exchange) {
         java.lang.String response = applicationService.getApplication();
         ..or..
         Application application = new Application(); //or whichever way you generate this.
         User user = new User(); //or which ever way u generate this.
         ApplicationResult result = applicationService.addApplication(application,user);
         ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM