2016-09-21 21 views
5

Tôi có một WSDL có chứa một loại phức tạp như vậy:Làm thế nào để sử dụng một loại phức tạp từ một WSDL với zeep bằng Python

<xsd:complexType name="string_array"> 
    <xsd:complexContent> 
    <xsd:restriction base="SOAP-ENC:Array"> 
     <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]"/> 
    </xsd:restriction> 
    </xsd:complexContent> 
</xsd:complexType> 

Tôi đã quyết định sử dụng zeep cho khách hàng xà phòng và muốn sử dụng mà nhập làm tham số cho một trong các phương thức khác được tham chiếu trong WSDL. Tôi không thể tìm ra cách sử dụng loại này. Khi tôi nhìn qua documentation về cách sử dụng cấu trúc dữ liệu nào đó tham chiếu trong WSDL, nó nói để sử dụng phương pháp client.get_type(), vì vậy tôi đã làm như sau:

wsdl = "https://wsdl.location.com/?wsdl" 
client = Client(wsdl=wsdl) 
string_array = client.get_type('tns:string_array') 
string_array('some value') 
client.service.method(string_array) 

này đưa ra một lỗi TypeError: argument of type 'string_array' is not iterable. Tôi cũng đã cố gắng rất nhiều biến thể của đó cũng như cố gắng sử dụng một từ điển như vậy:

client.service.method(param_name=['some value']) 

Mà cho lỗi

ValueError: Error while create XML for complexType '{https://wsdl.location.com/?wsdl}string_array': Expected instance of type <class 'zeep.objects.string_array'>, received <class 'str'> instead.` 

Nếu có ai biết làm thế nào để sử dụng các loại trên từ WSDL với zeep , Tôi sẽ rất biết ơn. Cảm ơn.

+0

Bạn đã giải quyết được vấn đề của mình chưa? Tôi đang đối mặt với một vấn đề tương tự tại thời điểm này – JohnnyQ

+1

Xin lỗi, tôi đã không làm như vậy. Vì SOAP không được sử dụng nhiều trong sản phẩm của tôi nên nó không đáng để bạn giải quyết. Dù sao cũng chúc bạn may mắn. – user197674

Trả lời

7

Phương thức client.get_type() trả về một 'hàm tạo kiểu' mà sau này bạn có thể sử dụng để xây dựng giá trị. Bạn cần chỉ định giá trị được tạo cho một biến riêng biệt và sử dụng biến đó trong lời gọi phương thức:

wsdl = "https://wsdl.location.com/?wsdl" 
client = Client(wsdl=wsdl) 
string_array_type = client.get_type('tns:string_array') 
string_array = string_array_type(['some value']) 
client.service.method(string_array) 
Các vấn đề liên quan