首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Zeep修改SOAP标头

使用Zeep修改SOAP标头
EN

Stack Overflow用户
提问于 2019-04-19 18:34:53
回答 2查看 810关注 0票数 1

我想在Python3下用Zeep (https://python-zeep.readthedocs.io/en/master/index.html)建立一个Soap连接。但是我不明白如何改变xml的头和主体!!

我想要拥有:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www...." xmlns:ns2="http://schemas....">
    <SOAP-ENV:Header>
        <ns2:UsernameToken>
            <Username>__USERNAME__</Username>
            <Password>__PASSWORD__</Password>
            <Reference>__REFERENCE__</Reference>
        </ns2:UsernameToken>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:requestAd/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我已经做到了:

代码语言:javascript
复制
"""Doc Placeholder."""

from zeep import Client
from zeep import Settings
from zeep.xsd import ComplexType
from zeep.xsd import Element
from zeep.xsd import String as xString

settings = Settings(strict=False,
                    xml_huge_tree=True,
                    extra_http_headers={'http://www....', 'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = Client(wsdl=wsdl, settings=settings)

header = Element('UsernameToken', ComplexType([Element('Username', xString()),
                                              Element('Password', xString()),
                                              Element('Reference', xString()),
                                               ]))
header_value = header(UsernameToken={'Username': '__USERNAME__',
                                     'Password': '__PASSWORD__',
                                     'Reference': '__REFERENCE__'})

我的错误是:

代码语言:javascript
复制
TypeError: ComplexType() got an unexpected keyword argument 'UsernameToken'. 
Signature: `Username: xsd:string, Password: xsd:string, Reference: xsd:string`

注意:我尝试了documentation中的所有解决方案,但都不起作用。

EN

回答 2

Stack Overflow用户

发布于 2019-06-25 05:21:54

当我在使用zeep时遇到同样的问题时,我使用get_type()方法在soap调用中嵌套数据。

代码语言:javascript
复制
"""index.py"""

import zeep

settings = zeep.Settings(strict=False,
                         xml_huge_tree=True,
                         extra_http_headers={'http://www....',
                                             'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = zeep.Client(wsdl=wsdl, settings=settings)
usernameTokenRef = client.get_type('ns2:UsernameToken')
usernameTokenValues = usernameTokenRef(Username='__USERNAME__',
                                       Password='__PASSWORD__',
                                       Reference='__REFERENCE__')

# pass args for UsernameToken into header of soap call
# using _soapheaders arg when calling a service
response = client.service.SomeService(_soapheaders={'UsernameToken':
                                      usernameTokenValues})
票数 1
EN

Stack Overflow用户

发布于 2020-09-06 21:50:58

在这种情况下,错误消息是非常详细的,因为只有一个Header元素的子元素您不需要指定它,Zeep将推断它。

错误消息是,当尝试呈现复杂类型时,它需要“用户名”、“密码”和“引用”,但得到的却是"UsernameToken“。

如果你删除了关键字参数"UsernameToken",你的代码就会正常工作,这里是一个工作版本,注意你需要在列表中传递头部:

代码语言:javascript
复制
headerQ = Element('Header', ComplexType([
  Element('{http://test_ns.com}UsernameToken', ComplexType(
    Sequence([
      Element('Username', String()),
      Element('Password', String()),
      Element('Reference', String())
    ]))
  )
]))
header_value = headerQ({'Username': '__USERNAME__', 'Password': '__PASSWORD__', 
  'Reference': '__REFERENCE__'})
client.set_default_soapheaders([header_value])

这将生成以下soap标头:

代码语言:javascript
复制
<soap-env:Header>
  <Header>
    <ns0:UsernameToken xmlns:ns0="http://test_ns.com">
      <Username>__USERNAME__</Username>
      <Password>__PASSWORD__</Password>
      <Reference>__REFERENCE__</Reference>
    </ns0:UsernameToken>
  </Header>
</soap-env:Header>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55760506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档