Skip to main content
 首页 » 编程设计

python之无法在 Python SOAP 调用中传递身份验证参数

2025年05月04日16mfrbuaa

我有一个 WSDL 文件

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:TestWebService"> 
   <soapenv:Header> 
      <urn:AuthenticationInfo> 
         <urn:userName>test</urn:userName> 
         <urn:password>test</urn:password> 
         <!--Optional:--> 
         <urn:authentication></urn:authentication> 
         <!--Optional:--> 
         <urn:locale></urn:locale> 
         <!--Optional:--> 
         <urn:timeZone></urn:timeZone> 
      </urn:AuthenticationInfo> 
   </soapenv:Header> 
   <soapenv:Body> 
      <urn:Pokupi> 
         <urn:Request_ID__c>000000000000141</urn:Request_ID__c> 
      </urn:Pokupi> 
   </soapenv:Body> 
</soapenv:Envelope> 

我的 Python 代码如下:

#import zeep 
from suds.client import Client 
from suds import WebFault 
from suds.sax.element import Element 
 
url = 'http://bmc2012.comtrade.co.yu:8080/arsys/WSDL/public/BMC2012/TestWebService' 
user = "test" 
password = "test" 
 
ssnp = Element("xsi:AuthenticationInfo").append(Element('xsi:userName').setText(user)) 
ssnp = Element("xsi:AuthenticationInfo").append(Element('xsi:password').setText(password)) 
client = Client(url) 
client.set_options(soapheaders=ssnp) 
 
record = client.factory.create('Pokupi') 
result = client.service.Pokupi(record) 
print result 
 
#client = zeep.Client(url) 
#print (client.service.Pokupi('000000000000141')) 

我没有收到响应数据,而是不断收到错误消息: 必须在控制记录中提供用户名

我尝试使用 zeep 和 suds 库,但我无法传递此消息。当我在 SOPA UI 中执行此调用时,我没有收到任何错误。 知道我做错了什么吗?

请您参考如下方法:

我遇到过类似的问题。以下是我为解决问题而采取的步骤(我使用“zeep”第 3 方模块来解决此问题):

  1. 运行以下命令以了解我的WSDL:

    python -mzeep **wsdl_url**

    (在您的情况下 wsdl_url 将是 http://bmc2012.comtrade.co.yu:8080/arsys/WSDL/public/BMC2012/TestWebService )

  2. 我们可以搜索字符串“Service:”。在下面我们可以看到我们的操作名称(我猜你的操作是“Pokupi”)。

  3. 对于我的操作,我发现了以下条目:

    MyOperation(param1 xsd:string, _soapheaders={parameters: ns0:AuthenticationInfo})

    这清楚地传达了这一点,我必须使用 kwargs "_soapheaders"传递一个字符串参数和一个 auth 参数

  4. 由此我了解到我必须将我的身份验证元素作为 _soapheaders 参数传递给 MyOperation 函数。

  5. 创建的 Auth 元素:

    auth_ele = client.get_element('ns0:AuthenticationInfo') auth = auth_ele(userName='me', password='mypwd')

  6. 将授权传递给我的操作:

    cleint.service.MyOperation('param1_value', _soapheaders=[auth])

我得到了预期的结果。虽然这是一个迟到的回复,但我认为这对像我这样受苦的人很少有帮助。