2016-09-21 45 views
5

mam WSDL, który zawiera kompleks typ tak:Jak używać typu złożonego z WSDL z zeep w Pythonie

<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> 

zdecydowałem się użyć zeep dla klienta mydła i chcą korzystać z tego wpisz jako parametr jednej z innych metod przywoływanych w pliku WSDL. Nie mogę się jednak domyślić, jak używać tego typu. Kiedy spojrzałem przez documentation na temat korzystania z pewnych struktur danych przywołanych w WSDL, to mówi się stosowanie metody client.get_type(), więc zrobiłem następujące:

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) 

To daje błąd TypeError: argument of type 'string_array' is not iterable. Próbowałem też wiele odmian, że jak próbuje użyć słownika tak:

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

co daje błąd

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.` 

Jeśli ktoś wie, jak użyć powyższego typu z WSDL z zeep , Byłabym wdzięczna. Dzięki.

+0

Czy udało Ci się rozwiązać swój problem? W tej chwili mam podobny problem. – JohnnyQ

+1

Przepraszam, ja nie. Ponieważ SOAP nie jest używany w moim produkcie tak często, nie było to warte czasu na rozwiązanie. Życzę ci powodzenia. – user197674

Odpowiedz

7

Metoda client.get_type() zwraca "konstruktor typów", który można później użyć do skonstruowania wartości. Musisz przypisać konstruowaną wartość do oddzielnej zmiennej i użyć tej zmiennej w wywołaniu metody:

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)