Анализ WSDL с помощью Python Zeep - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь использовать Zeep для описания операций и типов в данном WSDL, чтобы программа знала имена операций, имена их параметров, типы параметров и атрибуты параметров.

Эта информация будет использоваться для динамического создания пользовательского интерфейса для данного WSDL.

То, что я получил до сих пор, это просто строковые представления операций и типов. Используя код, подобный тому, который найден в этом ответе .

Вот пример:

from zeep import Client
import operator

wsdl = 'http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl'
client = Client(wsdl)

# get each operation signature
for service in client.wsdl.services.values():
    print("service:", service.name)
    for port in service.ports.values():
        operations = sorted(
            port.binding._operations.values(),
            key=operator.attrgetter('name'))

        for operation in operations:
            print("method :", operation.name)
            print("  input :", operation.input.signature())
            print()
    print()

# get a specific type signature by name
complextype = client.get_type('ns0:CartGetRequest')
print(complextype.name)
print(complextype.signature())

Это дает вывод, подобный следующему (сокращенно для краткости)

[...]

method : CartCreate
  input : MarketplaceDomain: xsd:string, AWSAccessKeyId: xsd:string, AssociateTag: xsd:string, Validate: xsd:string, XMLEscaping: xsd:string, Shared: ns0:CartCreateRequest, Request: ns0:CartCreateRequest[]

method : CartGet
  input : MarketplaceDomain: xsd:string, AWSAccessKeyId: xsd:string, AssociateTag: xsd:string, Validate: xsd:string, XMLEscaping: xsd:string, Shared: ns0:CartGetRequest, Request: ns0:CartGetRequest[]

[...]


CartGetRequest
{http://webservices.amazon.com/AWSECommerceService/2011-08-01}CartGetRequest(CartId: xsd:string, HMAC: xsd:string, MergeCart: xsd:string, ResponseGroup: xsd:string[])

Строковые представления, возвращаемые .signature (), имеют имена и типы, но я не знаю, как анализировать их по отдельности. Я пробовал зацикливаться на объектах attrs с помощью dir (), и они не содержат эту информацию. Кажется, что оно гораздо глубже.

Я мог бы проанализировать сами строковые представления, но тогда мне также не хватает, является ли параметр необязательным (более конкретно, если он имеет атрибут minOccurs = 0

Кажется, что SOAPpy на самом деле имеет эту функцию , но больше не поддерживается.

Так есть ли способ проанализировать WSDL с помощью zeep, который предоставляет детальную информацию о каждой операции, ее именах параметров, типах и атрибутах, аналогичных реализации SOAPpy? Или я должен проанализировать подпись или, альтернативно, проанализировать WSDL с помощью обычного синтаксического анализатора XML.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Основываясь на ответе от jordanm, я использовал следующее, чтобы получить все необходимые данные о доступных методах

from zeep import Client
from pprint import pprint

wsdl = 'http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl'
client = Client(wsdl)


def parseElements(elements):
    all_elements = {}
    for name, element in elements:
        all_elements[name] = {}
        all_elements[name]['optional'] = element.is_optional
        if hasattr(element.type, 'elements'):
            all_elements[name]['type'] = parseElements(
                element.type.elements)
        else:
            all_elements[name]['type'] = str(element.type)

    return all_elements


interface = {}
for service in client.wsdl.services.values():
    interface[service.name] = {}
    for port in service.ports.values():
        interface[service.name][port.name] = {}
        operations = {}
        for operation in port.binding._operations.values():
            operations[operation.name] = {}
            operations[operation.name]['input'] = {}
            elements = operation.input.body.type.elements
            operations[operation.name]['input'] = parseElements(elements)
        interface[service.name][port.name]['operations'] = operations


pprint(interface)
0 голосов
/ 30 апреля 2018

Вы можете получить доступ к элементам параметров с помощью operation.input.body.type.elements, который представляет собой список кортежей, содержащих объекты элементов. Эти объекты содержат такую ​​информацию, как тип.

(Pdb) operation.input.body.type.elements
[('MarketplaceDomain', <Element(name='MarketplaceDomain', type=<zeep.xsd.types.builtins.String object at 0x7f1bd8a4b320>)>), ('AWSAccessKeyId', <Element(name='AWSAccessKeyId', type=<zeep.xsd.types.builtins.String object at 0x7f1bd8a4b320>)>), ('AssociateTag', <Element(name='AssociateTag', type=<zeep.xsd.types.builtins.String object at 0x7f1bd8a4b320>)>), ('Validate', <Element(name='Validate', type=<zeep.xsd.types.builtins.String object at 0x7f1bd8a4b320>)>), ('XMLEscaping', <Element(name='XMLEscaping', type=<zeep.xsd.types.builtins.String object at 0x7f1bd8a4b320>)>), ('Shared', <Element(name='Shared', type=<zeep.xsd.dynamic_types.BrowseNodeLookupRequest object at 0x7f1bd8177e48>)>), ('Request', <Element(name='Request', type=<zeep.xsd.dynamic_types.BrowseNodeLookupRequest object at 0x7f1bd8177e48>)>)]
(Pdb) operation.input.body.type.elements[0][1].name
'MarketplaceDomain'
(Pdb) operation.input.body.type.elements[0][1].type.name
'string'
(Pdb) operation.input.body.type.elements[0][1].is_optional
True
...