【问题标题】:Datapower Soap Envelope Header Values from Request来自请求的 Datapower Soap 信封标头值
【发布时间】:2025-12-19 10:45:17
【问题描述】:

我在 Datapower 中有一个 WS 代理。客户端和后端都是 HTTP 。我的请求包含一个soap标头,其值如下: wsa:动作 wsa:消息ID wsa:回复 时间戳

后端不需要所有这些值,因此在向后端发送 cnverted 请求之前将它们剥离,显然这些在我从后端返回的响应中不存在。现在,当我从 Datapower 向客户端发送回响应时,我需要将所有这些值返回到响应 soap 标头中。一个

新创建的时间戳在 5 分钟后过期。 行动 消息ID 回复

有什么办法可以把它们放回去。我不想从 xslt 执行此操作,因为我相信 Datapower 提供了一些内置支持来处理此问题。

【问题讨论】:

    标签: soap soapheader ibm-datapower


    【解决方案1】:

    我只是将整个 SOAP-header 节点集存储在上下文变量中,然后在响应规则中替换它。当然,除非后端添加或修改特定值。在这种情况下,您可以选择要恢复的内容。

    【讨论】:

      【解决方案2】:

      请在下面找到代码 tp 删除标题并将其移动到上下文变量。 此外,您可以使用该上下文变量值将其放回原处。

      XSl1 : 将用户名和密码保存到上下文变量中`

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:dp="http://www.datapower.com/extensions"
      xmlns:dpconfig="http://www.datapower.com/param/config" 
      extension-element-prefixes="dp date dpconfig" exclude-result-prefixes=" dp dpconfig ">
      <xsl:template match="/">
       <xsl:variable name = "User">
       <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Header']/*[local-name()='Security']/*[local-name()='UsernameToken']/*[local-name()='Username']/text()"/>
      
      
      </xsl:variable>
      <xsl:variable name = "PWD">
      <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Header']/*[local-name()='Security']/*[local-name()='UsernameToken']/*[local-name()='Password']/text()"/>
      </xsl:variable> 
      <xsl:message dp:priority="debug">
        User name : <xsl:value-of select="$User"/>
       <xsl:message dp:priority="debug">
        Password : <xsl:value-of select="$PWD"/>
       </xsl:message>
      <dp:set-variable name="'var://context/Test/User'" value ="string($User)"/>
       <dp:set-variable name="'var://context/Test/Pws'" value ="string($PWD)"/>
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
      <soapenv:Header>
      </soapenv:Header>           
          <soapenv:Body>
      <xsl:copy-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*" />
      </soapenv:Body>
      </soapenv:Envelope>
       </xsl:template>
      </xsl:stylesheet>
      

      XSl2 :将用户名和密码重新添加到 SOAP 中。

      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions"
      xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
      xmlns:dpconfig="http://www.datapower.com/param/config" 
      extension-element-prefixes="dp dpconfig soapenv" exclude-result-prefixes="dp dpconfig">
          <xsl:template match="@*|node()">
      <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>  
      </xsl:template>
        <xsl:template match = "*[local-name() = 'Header']">
      
      
      <soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:appid xmlns:soap="http://na.az.com/soaplatform">?</soap:appid>
      <wsse:Security 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>
      <xsl:value-of select="dp:variable('var://context/Test/User')"/>
      </wsse:Username>
      <wsse:Password>
      <xsl:value-of select="dp:variable('var://context/Test/Pws')"/>
      </wsse:Password>
          </wsse:UsernameToken>
      </wsse:Security>
      </soapenv:Header>
      </xsl:template>
      </xsl:stylesheet>
      

      【讨论】: