如何消耗骡子流SOAP Web服务?(How to consume a SOAP web servi

2019-09-16 09:32发布

我开始用骡子流动和已经看到了我所看到的这个页面http://www.mulesoft.org/documentation/display/MULE3CONCEPTS/Using+Mule+with+Web+Services和http://www.mulesoft.org /文档/显示/ MULEWS /耗竭与+ SOAP +网络+服务+在+骡这种操作太。 他们是有很大帮助没有。 目前,我有一个简单的骡子流程如下图所示。

流程定义

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns:cxf="http://www.mulesoft.org/schema/mule/cxf" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="CE-3.2.1"
    xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/cxf http://www.mulesoft.org/schema/mule/cxf/current/mule-cxf.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <flow name="EchoFlow" doc:name="EchoFlow">
        <http:inbound-endpoint exchange-pattern="request-response"
            host="localhost" port="8081" path="service/echoflow" doc:name="HTTP" />
        <cxf:jaxws-client operation="" serviceClass="com.myapp.demo.ServiceAImplService" 
            doc:name="SOAP"/>
        <outbound-endpoint address="http://localhost:8080/ServiceA/services/" doc:name="Generic"/>
    </flow>
</mule>

我使用的骡子工作室。 有一个期望的响应的HTTP入站端点。 我试过配置JAX-WS客户端,将调用实际的Web服务。 该服务的WSDL是:

wsdl文件

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="ServiceAImplService" targetNamespace="http://service.demo.myapp.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<import namespace="http://service.demo.myapp.com/" schemaLocation="http://localhost:8080/ServiceA/services/ServiceAImplPort?xsd=serviceaimpl_schema1.xsd"/>
</schema>
  </wsdl:types>
  <wsdl:message name="helloResponse">
    <wsdl:part element="tns:helloResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="hello">
    <wsdl:part element="tns:hello" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IServiceA">
    <wsdl:operation name="hello">
      <wsdl:input message="tns:hello" name="hello">
    </wsdl:input>
      <wsdl:output message="tns:helloResponse" name="helloResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServiceAImplServiceSoapBinding" type="tns:IServiceA">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="hello">
      <soap:operation soapAction="urn:Hello" style="document"/>
      <wsdl:input name="hello">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="helloResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ServiceAImplService">
    <wsdl:port binding="tns:ServiceAImplServiceSoapBinding" name="ServiceAImplPort">
      <soap:address location="http://localhost:8080/ServiceA/services/ServiceAImplPort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

我也不太清楚有关配置JAX-WS客户端,你可以看到。 那么,究竟如何我消耗这个流SOAP Web服务。


我的第二个问题:我如何变换有效载荷进行呼叫从一个网络服务到其他网络服务(包括SOAP)。 会是怎样的流程?


最后,我怎么合并的有效载荷? 我说,我有三个叫并行Web服务和他们的反应都返回在一起。 如何合并的有效载荷,这样我可以(合并多的服务被称为并行的答复后),其他服务看过吗?



什么是相当于实施

       <pattern:web-service-proxy name="ex-proxy"
        inboundAddress="http://localhost:8081/xxx"
        outboundAddress="http://xx.xx.com/XXX_WS/xxxWService.asmx" /> 

利用CXF代理服务/客户端? 这使我想到另一个问题,当使用CXF服务以及何时使用CXF的客户端? 最后,是否有详细的文档和例子/教程骡流程编排?

Answer 1:

尝试使用CXF代理(服务端和客户端)。 在这种情况下,你会得到原始XML到流。 当然,你可以反序列化到Java,如果你通过XML到对象的变压器(XStream的)需要,例如。

http://www.mulesoft.org/documentation/display/MULE3USER/Proxying+Web+Services+with+CXF

从那里,有几种方法可以做到在中间变换的有效载荷。 要么去通过Java(如上所述)及变换的java层对象或编写XSLT片,其确实的transformation.Or变换用Java和/或其他工具骡提供(脚本,XPath等)的XML。

您可能要在细节再一次解释的聚集情况。 你要合并的答复以备将来使用或拥有一个Web服务调用 - >扇出 - >汇总 - >反应?



Answer 2:

1)一般情况下,你应该使用“代理服务”,而不是“JAX-WS”消费远程Web服务。

2)使用链接的路由器通过多个端点之间的反应。



Answer 3:

如果您可以访问网络服务的服务端点接口 ,您可以轻松地使用web服务在这样一个简单的Java的组件:

public class CityServiceComponent {

    public String process(String input) {

        // list of cities
        StringBuilder output = new StringBuilder();

        // create service factory
        JaxWsProxyFactoryBean serviceFactory = new JaxWsProxyFactoryBean();
        // set service endpoint interface
        serviceFactory.setServiceClass(CityService.class);
        // set wsdl location
        serviceFactory.setAddress("http://localhost:8080/city-service-provider/CityService?wsdl");
        // init city service
        CityService cityService = (CityService) serviceFactory.create();

        // call city service and get all available cities
        List<City> cities = cityService.findAll();

        // build list of cities
        for (City city : cities) {

            output.append(city.toString());
            output.append("\n");
        }

        // forward output message
        return output.toString();

    }

}

希望这可以帮助...



文章来源: How to consume a SOAP web service in a Mule Flow?