【问题标题】:Zeep with Complex Header带有复杂标题的 Zeep
【发布时间】:2020-07-15 22:05:03
【问题描述】:

使用 zeep 3.4.0

wsdl 在 header 中寻找以下信息

    <soapenv:Header>\n        
        <vv:sessionHeader soapenv:mustUnderstand=\"1\">\n
            <vv:sessionToken>\n
                <vv:Token1 xmlns:vv=\"http://www.z.com/zTypes.xsd\">{{Token1Token}}
                </vv:Token1>\n
                <vv:Token2 xmlns:vv=\"http://www.z.com/zTypes.xsd\">{{Token2Token}}
                </vv:Token2>\n
            </vv:sessionToken>\n
        </vv:sessionHeader>\n

我将参数传递给 _soapheaders 如下

    headerQ = xsd.Element('Header',xsd.ComplexType  ([
            xsd.Element('sessionHeader',xsd.ComplexType  ([
                xsd.Element('sessionToken', xsd.ComplexType ([
                    xsd.Element('Token1',xsd.String()),
                    xsd.Element('Token2',xsd.String())
                ]))
            ]))
        ]))

    header_value1 = headerQ({'Token1':Token1T, 'Token2':Token2T} )
    client.set_default_soapheaders(header_value1)

header_value1 看起来像这样

    {
        'sessionHeader': {
            'Token1': 'abcdef=',
            'Token2': 'ghijkl='
        }
    }

我收到以下错误:

    line 365, in _serialize_header
    raise ValueError("Invalid value given to _soapheaders")

_serialize_header 期望 header_value1 是列表或字典

isinstance(header_value1,dict) 返回 False

问题:

  • 将参数传递给 _soapheaders 的正确方法是什么
  • 为什么 sessionToken 没有反映在 header 中

【问题讨论】:

    标签: soap zeep


    【解决方案1】:

    使用 Zeep 调试东西总是有点挑战,但这里有一个可行的实现:

    为了正确渲染两个元素(Token1 和 Token2),您需要一个 xsd:Sequence 元素:

       headerQ = xsd.Element('Header', xsd.ComplexType([
         xsd.Element('{http://www.z.com/zTypes.xsd}sessionHeader', xsd.ComplexType([
           xsd.Element('{http://www.z.com/zTypes.xsd}sessionToken', xsd.ComplexType(
             xsd.Sequence([
               xsd.Element('{http://www.z.com/zTypes.xsd}Token1', xsd.String()),
               xsd.Element('{http://www.z.com/zTypes.xsd', xsd.String())
              ])))
            ], attributes=[xsd.Attribute('mustUnderstand', xsd.Boolean())
         ]))
       ]))
    

    提供 QNames 而不是原始元素名称将负责命名空间,最后您在 sessionToken 类型定义上设置属性。如果您的肥皂服务器拒绝接受“true”,那么您可以使用 xsd:Integer 类型,或者您可以使用 egress 插件将“true”重写为“1”shown here

    设置标题值的工作方式与您的尝试一样,但您需要包装到一个列表中:

    header_value1 = headerQ(
      {'mustUnderstand': True,
       'sessionToken': {'Token1': 'Token1T',
                        'Token2': 'Token2T'}
      }
    )
    client.set_default_soapheaders([header_value1])
    

    这给出了标题部分:

    <Header>
      <ns0:sessionHeader xmlns:ns0="http://www.z.com/zTypes.xsd" mustUnderstand="true">
        <ns0:sessionToken>
          <ns0:Token1>Token1T</ns0:Token1>
          <ns0:Token2>Token2T</ns0:Token2>
        </ns0:sessionToken>
      </ns0:sessionHeader>
    </Header>
    

    【讨论】:

      【解决方案2】:

      我没有使用内置方法,而是使用它

          header_value1 = {'sessionHeader': {'sessionToken': { \
          'primary': token1, secondary': token2}}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 2021-12-31
        • 2012-12-10
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 2011-06-14
        相关资源
        最近更新 更多