2015-12-31 5 views
1

Я новичок в Python и suds. Использование SOAP UI, вызов моей службы выглядит следующим образом:Python SUDS не включает параметр во время вызова

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns="<URL to service>" 
    xmlns:ns1="<URL to second namespace>"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ns:AuthenticateCaller> 
     <!--Optional:--> 
     <ns:request> 
      <ns1:LoanAccountNumber>292206816</ns1:LoanAccountNumber> 
     </ns:request> 
     </ns:AuthenticateCaller> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я попытался следующие с помощью мыльной пены:

from suds.xsd.doctor import ImportDoctor, Import 
imp = Import(<URL to service>) 
imp.filter.add(<URL to second namespace>) 
doctor = ImportDoctor(imp) 
client = Client(url, doctor=doctor) 
client.service.AuthenticateCaller(LoanAccountNumber='292206816') 

Сгенерированный XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope 
    xmlns:ns0="<URL to service>" 
    xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/ 
envelope/"> 
    <SOAP-ENV:Header/> 
    <ns1:Body> 
     <ns0:AuthenticateCaller/> 
    </ns1:Body> 
</SOAP-ENV:Envelope> 

Это отсутствует параметр LoanAccountNumber в вызове, который является ключом к API. Также не хватает второго пространства имен, которое, как я думал, должен был исправить ImportDoctor.

Мой вопрос: что мне не хватает, что LoanAccountNumber не включен в вызов API.

ответ

1

кажется, что следующие инструкции помогут вам:

Прежде всего, вы должны напечатать Client момент, который находится в вашем коде client, так что вы видите что-то вроде этого:

Suds (https://fedorahosted.org/suds/) version: 0.4 GA build: R699-20100913 

Service (YourService_cmV6YW9ubGluZS5uZXQ=) tns="http://www.yourservice.com/soap/YourService_cmV6YW9ubGluZS5uZXQ=" 
    Prefixes (1) 
    ns0 = "http://schemas.xmlsoap.org/soap/encoding/" 
    Ports (1): 
    (YourService_cmV6YW9ubGluZS5uZXQ=Port) 
    Methods (2): 
     your_method(xs:string _your_param) 
    Types (48): 
     ns0:Array 
     ns0:ENTITIES 
     ns0:ENTITY 
     ns0:ID 
     ns0:NOTATION 
     ns0:Name 
     ns0:QName 
     ns0:Struct 
     ns0:anyURI 
     ns0:arrayCoordinate 
     ns0:base64 
     ns0:base64Binary 
     ns0:boolean 
     ns0:byte 
     ns0:date 
     ns0:dateTime 
     ns0:decimal 
     ns0:double 
     ns0:duration 
     ns0:float 
     ns0:hexBinary 
     ns0:int 
     ns0:integer 
     ns0:language 
     ns0:long 
     ns0:negativeInteger 
     ns0:positiveInteger 
     ns0:short 
     ns0:string 
     ns0:time 
     ns0:token 

затем найдите подходящий тип параметра и создайте свой параметр следующим образом:

your_param = client.factory.create("ns0:string") 
your_param.value = your_value 

(Комплексные типы ! Следует сложные пути)

Теперь вы можете назвать свой метод следующим образом:

client.service.your_method(your_param) 

и наслаждайтесь!