получить данные из файла wsdl с помощью zeep в python

У меня есть доступ к файлу wsdl, и мне нужно получить в ответ список лекарств

но я застрял с этим, и вот моя попытка


from zeep import Client
from requests.auth import HTTPBasicAuth  
from requests import Session
from zeep.transports import Transport

username = 'username'
password = 'password'
wsdl = 'wsdl link'

session = Session()
session.auth = HTTPBasicAuth(username, password)
cl = Client(wsdl,transport=Transport(session=session))
r = cl.service.getDrugList('DRUGSTATUS')
print(r['DRUGSTATUS'])

это дает мне эту ошибку

zeep.exceptions.Fault: 80210

и когда я удаляю параметр из

r = cl.service.getDrugList()

это дает мне эту ошибку

raise exceptions.ValidationError(
zeep.exceptions.ValidationError: Missing element DRUGSTATUS (DrugListServiceRequest.DRUGSTATUS)

Обновить

--

после запроса г-на @ Tarique

по этой ссылке https://github.com/mvantellingen/python-zeep/issues/297#issuecomment-271803117 Я использую ту же команду и получаю тот же результат для mzssp wsdl linke, потому что обнаружил проблему с auth и вот результат


Prefixes:
    xsd: http://www.w3.org/2001/XMLSchema
    ns0: http://org linke/DrugListService

Global elements:
    ns0:DrugListServiceRequest(ns0:drugListServiceRequest)
    ns0:DrugListServiceRequestType(ns0:drugListServiceRequest)
    ns0:DrugListServiceResponse(ns0:drugListServiceResponse)
    ns0:DrugListServiceResponseType(ns0:drugListServiceResponse)
    ns0:ServiceError(ns0:faultBean)
    ns0:drug(ns0:drug)
    ns0:supplier(ns0:supplier)


Global types:
    xsd:anyType
    ns0:drug(GTIN: xsd:string, DRUGNAME: xsd:string, DOMAINID: xsd:short, LEGALSTATUS: xsd:short, MARKETINGSTATUS: xsd:short, DRUGSTATUS: xsd:short, SUPPLIERLIST: {SUPPLIER: ns0:supplier[]}, ISIMPORTABLE: xsd:short, ISEXPORTABLE: xsd:short, REGISTRATIONNUMBER: xsd:string, GENERICNAME: xsd:string, PRICE: xsd:decimal, DOSAGEFORM: xsd:string, PACKAGESIZE: xsd:string, PACKAGETYPE: xsd:string, STRENGTHVALUE: xsd:string, STRENGTHVALUEUNIT: xsd:string, VOLUME: xsd:string, UNITOFVOLUME: xsd:string)
    ns0:drugListServiceRequest(DRUGSTATUS: xsd:string)
    ns0:drugListServiceResponse(DRUGLIST: {DRUG: ns0:drug[]})
    ns0:faultBean(FC: xsd:string)
    ns0:supplier(GLN: xsd:string, SUPPLIERNAME: xsd:string)
    xsd:ENTITIES
    xsd:ENTITY
    xsd:ID
    xsd:IDREF
    xsd:IDREFS
    xsd:NCName
    xsd:NMTOKEN
    xsd:NMTOKENS
    xsd:NOTATION
    xsd:Name
    xsd:QName
    xsd:anySimpleType
    xsd:anyURI
    xsd:base64Binary
    xsd:boolean
    xsd:byte
    xsd:date
    xsd:dateTime
    xsd:decimal
    xsd:double
    xsd:duration
    xsd:float
    xsd:gDay
    xsd:gMonth
    xsd:gMonthDay
    xsd:gYear
    xsd:gYearMonth
    xsd:hexBinary
    xsd:int
    xsd:integer
    xsd:language
    xsd:long
    xsd:negativeInteger
    xsd:nonNegativeInteger
    xsd:nonPositiveInteger
    xsd:normalizedString
    xsd:positiveInteger
    xsd:short
    xsd:string
    xsd:time
    xsd:token
    xsd:unsignedByte
    xsd:unsignedInt
    xsd:unsignedLong
    xsd:unsignedShort

Bindings:
    Soap11Binding: {http://org linke/DrugListService}DrugListServiceBinding

Service: DrugListService
    Port: DrugListService (Soap11Binding: {http://org linke/DrugListService}DrugListServiceBinding)
        Operations:
           getDrugList(DRUGSTATUS: xsd:string) -> DRUGLIST: {DRUG: ns0:drug[]}

None




person Saeed ALSferi    schedule 03.05.2020    source источник
comment
запустите это: python -mzeep wsdl_link затем вставьте определение метода getDrugList(). тогда мы сможем помочь вам лучше.   -  person Tarique    schedule 04.05.2020
comment
не могли бы вы проверить MR. @Tarique в основном посте. Благодарю.   -  person Saeed ALSferi    schedule 04.05.2020


Ответы (1)


Спасибо за запрошенный результат.

из определения: getDrugList(DRUGSTATUS: xsd:string) -> DRUGLIST: {DRUG: ns0:drug[]} похоже, что метод getDrugList принимает только 1 аргумент строки типа и возвращает список из drug элементов.

вы передаете аргумент DRUGSTATUS, который, я не уверен, является допустимым статусом службы:

r = cl.service.getDrugList('DRUGSTATUS')

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

r = cl.service.getDrugList(DRUGSTATUS='some_status')
# where some_status is valid DRUGSTATUS string. It could be found in service docs or examples.

# then check the response status & content:
print(r.status_code)
print(r.content)

далее, если response - правильный ответ, то DRUGLIST можно напечатать с помощью цикла for.

надеюсь это поможет

person Tarique    schedule 04.05.2020
comment
У меня тоже есть такой же запрос, в моем случае есть несколько аргументов, пожалуйста, помогите мне в этом Ib440ConfigSet(NodeName: xsd:string, NodeDetail: ns0:NodeProperty, Ib440Details: ns0:Ib440DetailsSetWs, Ib440SnmpDetail: ns0:SnmpDetailSetWs, _soapheaders={Credentials: ns0:Credentials}) -> Ib440ConfigSetResult: ns0:NodeActionResult - person Sonu; 19.09.2020