Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';我不能在pysimplesoap中设置SOAP头吗?_Python_Web Services_Soap_Wsdl - Fatal编程技术网

Python 为什么可以';我不能在pysimplesoap中设置SOAP头吗?

Python 为什么可以';我不能在pysimplesoap中设置SOAP头吗?,python,web-services,soap,wsdl,Python,Web Services,Soap,Wsdl,我收到了一些调用SOAP服务的php代码示例,现在需要将其转换为Python。在php代码中,他们将标题设置如下: $auth = array(); $auth['token'] = 'xxx'; if ($auth) { // add auth header $this->clients[$module]->__setSoapHeaders( new SoapHeader( $namespace, '

我收到了一些调用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加载到中,这为我提供了以下示例xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sub="https://example.com/path/to/sub">
   <soapenv:Header>
      <sub:auth>
         <token>?</token>
         <!--Optional:-->
         <user_id>?</user_id>
         <!--Optional:-->
         <user_token>?</user_token>
      </sub:auth>
   </soapenv:Header>
   <soapenv:Body>
      <sub:customer_logos_pull>
         <!--Optional:-->
         <language>?</language>
         <!--Optional:-->
         <limit>?</limit>
         <!--Optional:-->
         <options_utc>?</options_utc>
      </sub:customer_logos_pull>
   </soapenv:Body>
</soapenv:Envelope>
但是我得到一个错误,它是
ExpatError:not-well format(invalid token):第1行第0列,这是有意义的,因为在记录的xml中,我看到头是空的:

<soap:Header/>

我尝试通过在
auth
之前包含
sub:
来改变代码,如下:
client['sub:auth']={'token':token}
,但我得到了相同的错误

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

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

下面是如何发送包含标头的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)
这是如何发送以下标题的示例:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP ENC="http://www.w3.org/2003/05/soap-encoding">
    <ssn:SessionID SOAP-ENV:mustUnderstand="true">123</ssn:SessionID>
 </SOAP-ENV:Header>

您可以通过运行以下命令轻松安装:

$ pip install suds

它必须使用吗?它甚至不能安装,因为它有点坏:/@JamesMills-它本身不需要是pysimplesoap。我只需要让它发挥作用。我也用肥皂水试过了。但我也无法实现这一点:我使用的库并不重要,它只需要使用Python即可。你知道在别的图书馆怎么做吗?
>>> 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(soapheaders=sub)
$ pip install suds