如何在Mulesoft中设置标题以调用Soap服务

时间:2018-07-18 13:16:36

标签: web-services soap mule mule-component soapheader

我想通过mulesoft打电话给一个肥皂服务。 要将标头附加到soap请求主体,我使用了这些链接-Mule 3.7. Add custom SOAP header to web-service-consumer。如该链接中所述,我在“ Web Service使用者”之前添加了“消息属性”组件,但出现以下异常-

com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "soapenv" (for attribute "actor")

我还使用此处提到的Property组件进行了尝试-https://dzone.com/articles/working-with-headers-in-mule-flows

仍然无法使用肥皂服务。还有其他方法可以将标题添加到soap请求正文中吗? 我想添加到我的肥皂请求中的标头-

<wsse:Security soapenv:actor="AppID" soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
    <wsse:Username>Pilot\ABCD</wsse:Username>
    <wsse:Password wsse:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">yt15#58</wsse:Password>
</wsse:UsernameToken>

-更新-我的代码-

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

<mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:ws="http://www.mulesoft.org/schema/mule/ws" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ws http://www.mulesoft.org/schema/mule/ws/current/mule-ws.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
     <ws:consumer-config name="Web_Service_Consumer_2" wsdlLocation="https://soa.abc.com/abcd_v4_0?wsdl" service="abcdService_vs0" port="xyz_Internal" serviceAddress=""https://soa.abc.com:56655/abcd_v4_0" doc:name="Web Service Consumer">
        <ws:security>
            <ws:wss-username-token username="user" password="password" passwordType="TEXT"/>
        </ws:security>
    </ws:consumer-config>
    <sub-flow name="tempSub_Flow">
        <set-property propertyName="soap.Security" value="&lt;wsse:Security soapenv:actor=&quot;AppID&quot; soapenv:mustUnderstand=&quot;1&quot; xmlns:wsse=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot; xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&gt;&lt;/wsse:Security&gt;" doc:name="Property"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/xml
%namespace ns0 urn:abc.com:schemas:gfr:a:b:service:2014-01-10
---
{
    ns0#addTransaction:{
        ns0#aTransaction: {
            ns0#transactionCode: "xyz",
            ns0#methodCode: "abc",
            ns0#amount: flowVars.amount,
            ns0#effectiveDate:  now as :string {format: "yyyy-MM-dd"}   

        }
    } 
}]]></dw:set-payload>
        </dw:transform-message>
        <ws:consumer config-ref="Web_Service_Consumer_2" operation="addEftTransaction" doc:name="Web Service Consumer"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
%namespace ns0 urn:abc.com:schemas:gfr:a:b:service:2014-01-10
---

payload.ns0#addTransactionResponse.ns0#transactionNumber
]]></dw:set-payload>
        </dw:transform-message>
    </sub-flow>
</mule>

1 个答案:

答案 0 :(得分:1)

---更新---

答案的两部分实际上是关于如何添加SOAP标头的直接问题,似乎您可能错过了为要添加的Security元素声明soapenv的命名空间的问题。例如,下面的代码应该可以将“ Security”标头添加到SOAP Envelope。必须定义整个XML元素,包括其使用的任何名称空间。

<set-property propertyName="soap.Security" value="&lt;wsse:Security soapenv:actor=&quot;AppID&quot; soapenv:mustUnderstand=&quot;1&quot; xmlns:wsse=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot; xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;&lt;wsse:UsernameToken&gt;&lt;wsse:Username&gt;Pilot\ABCD&lt;/wsse:Username&gt;&lt;wsse:Password wsse:Type=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText&quot;&gt;yt15#58&lt;/wsse:Password&gt;&lt;/wsse:UsernameToken&gt;&lt;/wsse:Security&gt;" doc:name="Set soap.Security"/>

这似乎没有吸引力,并且由于您要添加用户名/密码安全标头,因此您可能希望将其直接添加到Web Service Consumer配置本身的安全元素中:

<ws:consumer-config name="WSConfig" wsdlLocation="MyService.wsdl" service="MyService" port="MyPort" serviceAddress="https://example.com" doc:name="Web Service Consumer">
    <ws:security>
        <ws:wss-username-token username="Pilot\ABCD" password="yt15#58" passwordType="TEXT"/>
    </ws:security>
</ws:consumer-config>

上述问题是它不会添加soapenv:actor="appId"属性。

似乎WS使用者上的安全性配置将覆盖actor属性。以下代码主要在Mule 3.8上运行,并使用在此处找到的示例WSDL:https://github.com/skjolber/mockito-soap-cxf/tree/master/src/test/resources/wsdl

第一个流程将请求构建到SOAP Web服务,第二个流程仅接收第一个流程发出的请求并将其记录下来。

<mule xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" 
    xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" 
    xmlns:ws="http://www.mulesoft.org/schema/mule/ws" 
    xmlns:http="http://www.mulesoft.org/schema/mule/http" 
    xmlns="http://www.mulesoft.org/schema/mule/core" 
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ws http://www.mulesoft.org/schema/mule/ws/current/mule-ws.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
    <ws:consumer-config name="BankCustomerService_WS_Consumer" wsdlLocation="BankCustomerService.wsdl" service="BankCustomerService" port="BankCustomerServicePort" serviceAddress="http://localhost:8778/services/bankCustomer" doc:name="Web Service Consumer">
        <ws:security>
            <ws:wss-username-token username="user" password="password" passwordType="TEXT"/>
        </ws:security>
    </ws:consumer-config>
    <http:listener-config name="HTTP_TestListener" host="0.0.0.0" port="8092" doc:name="HTTP Listener Configuration"/>
    <http:listener-config name="HTTP_WebServiceStub" host="0.0.0.0" port="8778" doc:name="HTTP Listener Configuration"/>
    <flow name="soapsandboxFlow">
        <http:listener config-ref="HTTP_TestListener" path="/soap" doc:name="HTTP"/>
        <set-property propertyName="soap.Security" value="&lt;wsse:Security soapenv:actor=&quot;AppID&quot; xmlns:wsse=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot; xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; /&gt;" doc:name="Set soap.Security"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/xml
%namespace ns0 http://example.bank.skjolber.github.com/v1
---
{
    ns0#getAccountsRequest: {
        ns0#customerNumber: 987654321,
        ns0#certificate: 1234
    }
}]]></dw:set-payload>
        </dw:transform-message>
        <ws:consumer config-ref="BankCustomerService_WS_Consumer" operation="getAccounts" doc:name="Web Service Consumer"/>
    </flow>
    <flow name="soapsandboxFlow1">
        <http:listener config-ref="HTTP_WebServiceStub" path="services/bankCustomer" doc:name="HTTP"/>
        <logger message="#[message.payloadAs(String)]" level="INFO" doc:name="Logger"/>
    </flow>
</mule>

运行一个简单的GET请求到localhost:8092会创建一个静态Web服务请求,并将其通过WS Consumer组件发送到。存根中的记录器将打印出整个SOAP信封,如下所示,其中包括安全标头,但不包括actor属性:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <wsse:Security xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1">
            <wsse:UsernameToken wsu:Id="UsernameToken-CA524029E5DEDE6E3715320371056746">
                <wsse:Username>user</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </soap:Header>
    <soap:Body>
        <ns0:getAccountsRequest xmlns:ns0="http://example.bank.skjolber.github.com/v1">
            <ns0:customerNumber>987654321</ns0:customerNumber>
            <ns0:certificate>1234</ns0:certificate>
        </ns0:getAccountsRequest>
    </soap:Body>
</soap:Envelope>

我将做更多的研究,看看是否可以在安全性标头中包含actor属性。由于这是一个标准属性,因此应该可以。我将在可能的情况下更新此答案。

约翰逊。