2014-10-30 45 views
1

我想创建一个与suds,一个python库的SOAP请求。不过我有点卡住了。我已经研究过关于此的其他主题。但不能解决我的问题。似乎类型从命名空间(ns1)中缺失。 OK代码:缺少类型名称空间泡沫SOAP python

from suds.client import Client 
from suds.xsd.doctor import Import, ImportDoctor 

url = "https://relatics.relaticsonline.com/DataExchange.asmx?wsdl" 

imp = Import('http://schemas.xmlsoap.org/soap/encoding/') 
imp.filter.add('http://www.relatics.com/') 
d = ImportDoctor(imp) 
client = Client(url, doctor=d, location="https://rijkswaterstaat.relaticsonline.com/DataExchange.asmx") 

print(client) 

输出如下:

Service (DataExchange) tns="http://www.relatics.com/" 
    Prefixes (2) 
     ns0 = "http://schemas.xmlsoap.org/soap/encoding/" 
     ns1 = "http://www.relatics.com/" 
    Ports (2): 
     (DataExchangeSoap) 
     Methods (2): 
      GetResult(xs:string Operation, Identification Identification, Parameters Parameters, Authentication Authentication) 
      Import(xs:string Operation, Identification Identification, Authentication Authentication, xs:string Filename, xs:string Data) 
     Types (48): 
      ns0:Array 
      ns0:ENTITIES 
      ns0:ENTITY 
      ns0:ID 
      ns0:IDREF 
      ns0:IDREFS 
      ns0:NCName 
      ns0:NMTOKEN 
      ns0:NMTOKENS 
      ns0:NOTATION 
      ns0:Name 
      ns0:QName 
      ns0:Struct 
      ns0:anyURI 
      ns0:arrayCoordinate 
      ..... 

没有类型的命名空间 “NS1”。所以我甚至不能提出请求,因为我需要为Authentication/Identification/Parameters创建一个对象。

我认为模式出于某种原因出了问题。但我无法弄清楚。

+0

这可能是泡沫中的一个错误。不幸的是,fedorahosted上的泡沫版本实际上没有维护。作为第一步,我建议尝试[jurko-suds](https://bitbucket.org/jurko/suds)(泡沫分叉),[pysimplesoap](https://github.com/pysimplesoap/pysimplesoap)或[肥皂鱼](http://www.soapfish.org)(免责声明:我对肥皂鱼做出了贡献)。 – 2014-11-24 08:20:10

回答

2

它没有工作的原因是因为SUDS只适用于SOAP 1.0。我试图与SOAP 2.0沟通。我通过发送一个原始XML请求解决了这个问题,如下所示:

raw_xml = """ 
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Body> 
     <GetResult xmlns="http://www.relatics.com/"> 
     <Operation>%s</Operation> 
     <Identification> 
        <Identification> 
         <Workspace>%s</Workspace> 
        </Identification> 
       </Identification> 
       <Authentication> 
        <Authentication> 
         <Entrycode>%s</Entrycode> 
         </Authentication> 
       </Authentication> 
      </GetResult> 
     </soap:Body> 
    </soap:Envelope>""" 

raw_xml = str.encode(raw_xml % (Operation, Workspace, Entrycode)) 

client = Client(url) 
response = client.service.GetResult(__inject={'msg': raw_xml}) 
相关问题