为什么我不能在pysimplesoap中设置SOAP头呢?

2024-06-26 13:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我收到了一些调用SOAP服务的php示例代码,现在需要将其转换为Python。在php代码中,它们将头设置如下:

$auth = array();
$auth['token'] = 'xxx';
if ($auth) {
    // add auth header
    $this->clients[$module]->__setSoapHeaders(
        new SoapHeader(
            $namespace, 
            'auth', 
            $auth
        )
    );
}

所以auth头应该是这样的:['token' => 'xxx']。然后,我将wsdl加载到SoapUI,其中给出了以下示例xml:

^{pr2}$

在pysimplesoap中,我现在尝试如下操作:

from pysimplesoap.client import SoapClient

WSDL = 'https://example.com/some/path/sub.wsdl'
TOKEN = 'xxx'

client = SoapClient(wsdl=WSDL, trace=True)
client['auth'] = {'token': TOKEN}
print client.customer_logos_pull({})

但是我得到一个错误,说ExpatError: not well-formed (invalid token): line 1, column 0,这是有意义的,因为在记录的xml中,我看到头是空的:

<soap:Header/>

我试图通过在auth之前包括sub:这样来改变代码:client['sub:auth'] = {'token': TOKEN},但是我得到了相同的错误。在

有人知道我做错了什么吗?欢迎所有提示!在


Tags: 代码clienttokenauth示例错误xmlsoap
1条回答
网友
1楼 · 发布于 2024-06-26 13:29:02

所以我认为我们可以通过使用suds库来解决这个问题。在

下面是一个非常基本的示例,说明如何发送包含头的SOAP请求:

示例:

from suds.sax.element import Element 

client = client(url) 
ssnns = ('ssn', 'http://namespaces/sessionid') 
ssn = Element('SessionID', ns=ssnns).setText('123') 
client.set_options(soapheaders=ssn)  
result = client.service.addPerson(person)

以下是如何发送以下标题的示例:

^{pr2}$

NB:我实际上还没有尝试过这一点,因为我无法访问任何可用的SOAP/XML服务来进行测试!在

所以在你的例子中,你可以这样做:

>>> from suds.sax.element import Element
>>> subns = ("sub", "http://namespaces/sub")
>>> sub = Element("auth", ns=subns)
>>> token = Element("token").setText("?")
>>> user_id = Element("user_id").setText("?")
>>> user_token = Element("user_token").setText("?")
>>> sub.append(token)
Element (prefix=sub, name=auth)
>>> sub.append(user_id)
Element (prefix=sub, name=auth)
>>> sub.append(user_token)
Element (prefix=sub, name=auth)
>>> print(sub.str())
<sub:auth xmlns:sub="http://namespaces/sub">
   <token>?</token>
   <user_id>?</user_id>
   <user_token>?</user_token>
</sub:auth>

然后对您的client对象调用set_options()

client.set_options(soapheaders=sub)

通过运行以下命令,您可以使用pip轻松安装suds

$ pip install suds

相关问题 更多 >