【问题标题】:How To Preserve SOAP Headers to use with Mule 4 Web Service Consumer?如何保留 SOAP 标头以与 Mule 4 Web 服务使用者一起使用?
【发布时间】:2020-08-20 10:20:02
【问题描述】:

我已经使用现有的 WSDL 创建了一个体验 API,在此之前我要执行几个步骤:

  1. 使用 Mule4 Web 服务使用者将 SOAP 请求消息按原样传递到原始后端系统或
  2. 调用另一个后端系统 (RESTful API) 并转换响应以匹配预期的 SOAP 响应消息

示例消息

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="urn:Acme/PublicService/V1" xmlns:ns0="urn:/Acme/BasicDataPublicService/V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Header>
        <a:Action s:mustUnderstand="1" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">urn:Acme/PublicService/V1/PublicService/SetCustomer</a:Action>
        <a:MessageID xmlns:a="http://www.w3.org/2005/08/addressing">urn:uuid:4afe0693-adea-4ede-bec9-10b694708d85</a:MessageID>
        <a:ReplyTo xmlns:a="http://www.w3.org/2005/08/addressing">
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
        <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo8KxyyGpakdIj8o84JOeAMsAAAAAQBkt3vfAK0C4dDgn3rAKx/iXgqYosnhKv/OHgph9cXoACQAA</VsDebuggerCausalityData>
        <a:To s:mustUnderstand="1" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">http://316.820.517.311:36990/PublicInterface/Service</a:To>
        <AuthorizationToken xmlns="urn:Acme/Authorization/V1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <CultureName>uk-UK</CultureName>
            <OnBehalfOf i:nil="true"></OnBehalfOf>
            <Password>****</Password>
            <UserName>sa-ACME</UserName>
        </AuthorizationToken>
    </env:Header>
    <env:Body>
        <ns:SetCustomer>Muli-Tier Message</ns:SetCustomer>
    </env:Body>
</env:Envelope>

根据Mulesoft KB;这需要在流程开始时执行额外的转换步骤。传递 SOAP 主体不是问题;然而,SOAP Header 是一个泡菜。特别是因为 KB 文档对值进行了硬编码;而在我的情况下,这些需要是动态的(即来自原始 SOAP 请求消息)。

我尝试将标题参数映射到所描述的变量,但我似乎无法做到。

选项1将标题元素映射到变量的子属性,导致变量存储空

%dw 2.0
output application/xml writeDeclaration=false, writeNilOnNull=true
ns ns0 http://www.w3.org/2005/08/addressing
ns s http://www.w3.org/2003/05/soap-envelope
---
headers: {
    ns0#Action @(s#mustUnderstands: payload.headers.Action.@mustUnderstands): payload.headers.Action as String default null,
    ns0#MessageID: payload.headers.MessageID as String default null,
    ns0#ReplyTo: {
        ns0#Address: payload.headers.ReplyTo.Address as String default null
    },
    VsDebuggerCausalityData: payload.headers.VsDebuggerCausalityData as String default null,
    ns0#To @(s#mustUnderstands: payload.headers.To.@mustUnderstands): payload.headers.To as String default null,
    AuthorizationToken: {
        CultureName: payload.headers.AuthorizationToken.CultureName as String default null,
        OnBehalfOf: payload.headers.AuthorizationToken.OnBehalfOf as String default null,
        Password: payload.headers.AuthorizationToken.Password as String default null,
        UserName: payload.headers.AuthorizationToken.UserName as String default null
    }
}

选项 2payload.headers 映射到变量,会产生额外的标签;并丢失 XML 标记属性

%dw 2.0
output application/xml writeDeclaration=false, writeNilOnNull=true
ns ns0 http://www.w3.org/2005/08/addressing
ns s http://www.w3.org/2003/05/soap-envelope
---
headers: payload.headers

【问题讨论】:

  • 您应该使用 HTTP 线路日志 (help.mulesoft.com/s/article/How-to-Enable-HTTP-Wire-Logging) 而不是调试器,以显示标头在 WSC 中的实际发送方式并将结果附加到此处。还包括显示转换和 WSC 的 XML 中的流 sn-p,以便有更多上下文来理解行为。
  • 嗨。您能否澄清一下您是否使用 APIKit for SOAP 来公开 API?我不明白是什么在流程中创建了“payload.headers”。
  • @JorgeGarcia 是的,我正在使用 SOAP Kit;流由 Anypoint Studio 从 WSDL 生成;然后我填空了。
  • @aled 我会尝试在早上做第一件事;现在我正在稍微扭曲选项 2,似乎我将拥有我的标题。基本上:我从双标签(#notClean)中提取数据

标签: soap dataweave mulesoft mule4 wsc


【解决方案1】:

在生成 SOAP Envelope Header 时,WebService Consumer 连接器似乎存在问题。

尝试使用 HTTP 请求连接器按原样传递有效负载,而不是使用 WebService 消费者连接器。

【讨论】:

  • 这听起来是一个有趣的方法,但这里的妥协是什么?例如我会失去什么功能?
  • 主要缺点是您必须手动处理 SOAP 响应。归根结底,SOAP 请求只不过是 HTTP POST 请求,其内容是符合 SOAP Envelope 规范的 XML。您知道远程 Web 服务中实现了哪些安全策略吗?
【解决方案2】:

我会回来添加更多关于答案的细节,但这里是解决这个问题的方法:

%dw 2.0
output application/xml writeDeclaration=false, writeNilOnNull=true
---
headers: (payload.headers.headers mapObject (value, key) -> {
(value)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2012-04-20
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多