Создать параметр строкового массива с помощью zeep?

У меня есть веб-сервис, предоставляемый поставщиком; WSDL для определенной операции выглядит так:

<complexType name="ArrayOf_soapenc_string">
 <complexContent>
  <restriction base="soapenc:Array">
   <attribute ref="soapenc:arrayType" wsdl:arrayType="soapenc:string[]"/>
  </restriction>
 </complexContent>
</complexType>
...
<wsdl:message name="initExportDeviceRequest">
 <wsdl:part name="filter" type="soapenc:string"/>
 <wsdl:part name="options" type="impl:ArrayOf_soapenc_string"/>
</wsdl:message>
...
<wsdl:operation name="initExportDevice" parameterOrder="filter options">
 <wsdl:input message="impl:initExportDeviceRequest" name="initExportDeviceRequest"/>
 <wsdl:output message="impl:initExportDeviceResponse" name="initExportDeviceResponse"/>
</wsdl:operation>

Запуск python -mzeep ipam_export.wsdl на WSDL дает следующее:

Global types:
 ns0:ArrayOf_soapenc_string(_value_1: string[], arrayType: xsd:string, offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {})
...
Service: ExportsService
 Port: Exports (Soap11Binding: {http://diamondip.com/netcontrol/ws/}ExportsSoapBinding)
  Operations:
   ...
   initExportDevice(filter: ns1:string, options: {_value_1: string[], arrayType: xsd:string, offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {}}) -> initExportDeviceReturn: ns2:WSContext

Мне трудно выполнить вызов initExportDevice, в частности параметр options.


Как использовать сложный тип из WSDL с zeep в Python подсказывает мне, что это должно работать:

filter_type=client.get_type('ns1:string')
filter=filter_type('addrType=4')
options_type=client.get_type('ns0:ArrayOf_soapenc_string')
options=options_type(['recurseContainerHierarchy'])
client.service.initExportDevice(filter, options)

но это вызывает исключение

Any element received object of type 'str', expected lxml.etree._Element or zeep.objects.string
See http://docs.python-zeep.org/en/master/datastructures.html#any-objects for more information

Любой из

options_type=client.get_type('ns0:ArrayOf_soapenc_string')
options=options_type('recurseContainerHierarchy')
client.service.initExportDevice(filter, options)

or

factory = client.type_factory('ns0')
options=factory.ArrayOf_soapenc_string(['recurseContainerHierarchy'])
client.service.initExportDevice(filter=filter, options=options)

or

factory = client.type_factory('ns0')
options=factory.ArrayOf_soapenc_string('recurseContainerHierarchy')
client.service.initExportDevice(filter=filter, options=options)

or

factory = client.type_factory('ns0')
options=factory.ArrayOf_soapenc_string(_value_1=['recurseContainerHierarchy'])
client.service.initExportDevice(filter=filter, options=options)

все вызывают одно и то же исключение


options_type=client.get_type('ns0:ArrayOf_soapenc_string')
options=xsd.AnyObject(options_type, ['recurseContainerHierarchy'])
client.service.initExportDevice(filter, options)

дает

argument of type 'AnyObject' is not iterable

Как мне построить этот параметр?


person Douglas Wegscheid    schedule 22.02.2017    source источник


Ответы (1)


Хорошо, у меня тоже были проблемы с этим, используя Zeep (легко работает с пеной), проблема в том, что Zeep возвращает массивы как функцию (из моего тестирования), поэтому вам нужно назначить функцию массиву, а затем изменить его. Из вашего текущего кода выглядит так, как будто вы передаете данные непосредственно в функцию (которая не сохраняет их).

Используя приведенный выше пример, приведенный ниже должен получить тип массива и позволить вам изменить его как допустимый тип данных.

emptyArrayPlaceholder = client.get_type('ns0:ArrayOf_soapenc_string')

Затем Zeep возвращает этот тип как функцию, поэтому сначала вам нужно назначить эту функцию переменной, например:

options = emptyArrayPlaceholder()

Если вы затем проверяете параметры, вы увидите, что это dict с вашим списком внутри него.

print (options)
{'soapenc': []}

Затем вы можете легко добавлять элементы в массив с помощью:

options['soapenc'].append('Foo')

После этого вы сможете отправить своего клиента с помощью

client.service.initExportDevice(filter, options)

В качестве параметров теперь допустимый тип данных Zeep.

person crooksey    schedule 28.06.2017
comment
Не могли бы вы помочь мне в этом аналогичном вопросе stackoverflow.com/questions/44586989/ - person Hussain; 19.07.2017
comment
Я обнаружил, что эта проблема также может быть полезной. - person kjpc-tech; 14.01.2019
comment
Привет, Crooksey, у меня есть вопрос по Zeep, который может вас заинтересовать с доступной наградой: stackoverflow.com/questions/54201921/ - person Liquidgenius; 18.01.2019