java - 使用 Camel 生成 soap 请求

标签 java web-services soap cxf apache-camel

我想使用 wsdl 文件从 camel 调用第三方网络服务而不生成任何客户端代码(因为我认为如果我提供 wsdl 文件然后 camel 能够生成我们之前生成的客户端并且在我们的旧代码中工作)

经过长时间的搜索,我找到了一些可以帮助我实现目标的代码

代码是

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

这工作正常,但在这里我手动生成 soap Envelop

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>

现在我想生成 soap 请求而不是静态请求

请帮帮我

提前致谢

最佳答案

我改变了我的代码如下 现在它工作正常,但我认为我没有正确使用 Camel

所以请帮助我改进使用 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;
    }
}

关于java - 使用 Camel 生成 soap 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883021/

相关文章:

java - 如何使所有 Builder 方法成为必需的?

web-services - Indy IdHTTPServer GET 响应参数随机丢失

web-services - 如何在非常复杂的业务规则上实现 BDD?

ruby - 如何使用 WSDL 并在 Ruby 中实现 SOAP 服务器?

php - 带有 php 内置 SoapClient 的附件?

java - 使用 arraylist<string> 填充 Android 微调器

Java 将 key 保存到 keystore KeyStoreException

java - 立即同步 Vaadin 中的两个表

web-services - 从 jsp 调用 Jasper Server 报告

php - CodeIgniter Web 服务客户端