Python - zeep - WSDL 连接 / 如何去做?



我只学习了一周的python 我需要连接到WSDL服务,为此我选择了Python3。 连接本身 - 即简单地填写登录字段似乎很容易。我在填写大表格时遇到问题。你是怎么做到的?如何不重写整个结构名称?

我以这种方式获得凭据:

import zeep
import requests
import urllib3
requests.packages.urllib3.disable_warnings()
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
ewus_login2 = "https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl"
ewus_service2 = "https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker?wsdl"
transport = zeep.Transport()
login = "XXXXXXXXXX"
nfz = "XX"
kod_personelu = "XXXXXXXX"
haslo = "AAAAAAAAAAAA"
param = {"item": [{"name": "domain", 'value': {"stringValue": '01'}},{"name": "idntLek", 'value': {"stringValue": kod_personelu}},{"name": "login", 'value': {"stringValue": login}},{"name": "type", 'value': {"stringValue": 'LEK'}}]}

client = zeep.Client(wsdl=ewus_login2,transport=transport)
odp=client.service.login(credentials=param, password=haslo)
print(odp.body)
print("SESSION_ID:",odp.header.session.id)
print("TOKEN:",odp.header.token.id)

好的,现在我需要获取一些数据:

client2 = zeep.Client(wsdl=ewus_service, transport=transport)
client2.wsdl.dump()

我成为:

Prefixes:
xsd: http://www.w3.org/2001/XMLSchema
ns0: http://xml.kamsoft.pl/ws/broker
ns1: http://www.w3.org/2005/05/xmlmime
ns2: http://xml.kamsoft.pl/ws/common
ns3: http://wsdl.kamsoft.pl/common
Global elements:
ns0:executeService(ns0:ServiceRequest)
ns0:executeServiceReturn(ns0:ServiceResponse)
ns2:authToken(id: xsd:string)
ns2:authTokenError(ns2:AuthTokenException)
ns2:authenticationError(ns2:AuthenticationException)
ns2:authorizationError(ns2:AuthorizationException)
ns2:inputError(ns2:InputException)
ns2:location(ns2:ServiceLocation)
ns2:passExpiredError(ns2:PassExpiredException)
ns2:serverError(ns2:ServerException)
ns2:serviceError(ns2:ServiceException)
ns2:session(id: xsd:string)
ns2:sessionError(ns2:SessionException)
Global types:
xsd:anyType
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
ns1:base64Binary(xsd:base64Binary, contentType: ns1:contentType)
ns1:hexBinary(xsd:hexBinary, contentType: ns1:contentType)
ns0:ArrayOfParam(item: ns0:Param[])
ns0:Param(name: xsd:string, value: xsd:string)
ns0:Payload(textload: {_value_1: ANY}, streamload: {stream: ns1:base64Binary, name: xsd:string})
ns0:Service(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
ns0:ServiceRequest(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
ns0:ServiceResponse(location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload)
ns2:ArrayOfMessage(Message: xsd:string[])
ns2:AuthTokenException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:AuthenticationException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:AuthorizationException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:BaseException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:InputException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:PassExpiredException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:ServerException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:ServiceException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
ns2:ServiceLocation(namespace: xsd:string, localname: xsd:string, version: xsd:string, id: xsd:string)
ns2:SessionException(location: ns2:ServiceLocation, faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ns2:ArrayOfMessage)
Bindings:
Soap11Binding: {http://xml.kamsoft.pl/ws/broker}ServiceBrokerSoapBinding
Service: ServiceBroker
Port: ServiceBroker (Soap11Binding: {http://xml.kamsoft.pl/ws/broker}ServiceBrokerSoapBinding)
Operations:
executeService(id: xsd:string) -> location: ns2:ServiceLocation, date: xsd:dateTime, params: ns0:ArrayOfParam, payload: ns0:Payload

现在我应该生成类似这里的东西:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://xml.kamsoft.pl/ws/common" xmlns:brok="http://xml.kamsoft.pl/ws/broker">
<soapenv:Header>
<com:session id="${SessionIDAuthToken#SessionID}" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
<com:authToken id="${SessionIDAuthToken#AuthToken}" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
</soapenv:Header>
<soapenv:Body>
<brok:executeService>
<com:location>
<com:namespace>nfz.gov.pl/ws/broker/cwu</com:namespace>
<com:localname>checkCWU</com:localname>
<com:version>3.0</com:version>
</com:location>
<brok:date>2008-09-12T09:37:36.406+01:00</brok:date>
<brok:payload>
<brok:textload>
<ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3">
<ewus:numer_pesel>ASKED_PESEL</ewus:numer_pesel>
<ewus:system_swiad nazwa="client-eWUŚ" wersja="1.0.0"/>
</ewus:status_cwu_pyt>
</brok:textload>
</brok:payload>
</brok:executeService>
</soapenv:Body>
</soapenv:Envelope>

我可以简单地将此XML保存到文件中,将其放在正确的位置,例如#%,然后将值动态插入正确的位置,然后将其作为RAW发送到服务器。 我想优雅地做。 如何使用zeep生成上述文件,如何完成数据:身份验证令牌,询问PESEL,生成日期?

现在我有很多:

header = zeep.xsd.ComplexType([
zeep.xsd.Element('session', zeep.xsd.String()),
zeep.xsd.Element('authToken', zeep.xsd.String())
])
header_v = header('my session ID ',"my token ID")
print(header_v)

直到现在,我不知道该怎么办!请帮忙! 我发现了类似的东西

config = client.type_factory('ns3').loginParams()
print(config)

更新 2019/9/13

到目前为止,我有这个:

'''
location
'''
location = client2.get_type('ns1:ServiceLocation')
location_ = location(namespace='nfz.gov.pl/ws/broker',
localname='checkCWU', version='3.0')
'''
date
'''
dt = datetime.datetime.now()  # strftime('%Y-%m-%dT%H:%M:%S.000Z',gmtime())
'''
payload
'''
payLoad = client2.get_type('ns2:Payload')
payLoadH = zeep.xsd.Element(
'{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}status_cwu_pyt', zeep.xsd.ComplexType([
zeep.xsd.Element('numer_pesel', zeep.xsd.String()),
zeep.xsd.Element('system_swiad',zeep.xsd.ComplexType([
zeep.xsd.Attribute('nazwa', zeep.xsd.String()),
zeep.xsd.Attribute('wersja',zeep.xsd.String())
])
)
])
)
payloadH_=payLoadH('PESEL',{'AFYA_Python3','1.0.0'})
payLoad_ = payLoad(textload=payloadH_)
#authToken = client2.get_type('ns1:authToken')
authToken_={'id':'ID AUTH TOKENA'}
#sessionId = client2.get_type('ns1:session')
sessionId_={'id':'ID SESJI'}
soapheaders={'session':sessionId_,'token':authToken_}
sR = client2.service.executeService(
location=location_, date=dt, payload=payLoad_,_soapheaders=soapheaders)

我现在不知道我错了什么

Traceback (most recent call last):
File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/lib/python/ptvsd/__main__.py", line 432, in main
run()
File "/home/marcin/.vscode/extensions/ms-python.python-2019.9.34911/pythonFiles/lib/python/ptvsd/__main__.py", line 316, in run_file
runpy.run_path(target, run_name='__main__')
File "/usr/lib/python3.7/runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "/usr/lib/python3.7/runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/marcin/SynologyDrive/Serwery/html/recepta.py", line 111, in <module>
location=location_, date=dt, payload=payLoad_)#, _soapheaders=soapheaders)
File "/usr/local/lib/python3.7/dist-packages/zeep/proxy.py", line 42, in __call__
self._op_name, args, kwargs)
File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 132, in send
return self.process_reply(client, operation_obj, response)
File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 194, in process_reply
return self.process_error(doc, operation)
File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 299, in process_error
detail=fault_node.find('detail'))
zeep.exceptions.Fault: org.apache.axis2.databinding.ADBException: Unexpected subelement system_swiad

但我认为,我的有效载荷H有问题,因为: 如果我这样做:

node = client2.create_message(
client2.service, 'executeService', location=location_,date=dt,payload=payLoad_,_soapheaders=soapheaders)
print("NODE:>>",lxml.etree.tostring(node))

我成为:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><soap-env:Header><ns0:session xmlns:ns0="http://xml.kamsoft.pl/ws/common" id="ID SESJI"/><ns1:authToken xmlns:ns1="http://xml.kamsoft.pl/ws/common" id="ID AUTH TOKENA"/></soap-env:Header><soap-env:Body><ns0:executeService xmlns:ns0="http://xml.kamsoft.pl/ws/broker"><ns1:location xmlns:ns1="http://xml.kamsoft.pl/ws/common"><ns1:namespace>nfz.gov.pl/ws/broker</ns1:namespace><ns1:localname>checkCWU</ns1:localname><ns1:version>3.0</ns1:version></ns1:location><ns0:date>2019-09-13T09:35:49.210468</ns0:date><ns0:payload><ns0:textload><numer_pesel>PESEL</numer_pesel><system_swiad/></ns0:textload></ns0:payload></ns0:executeService></soap-env:Body></soap-env:Envelope>

如您所见: 我应该成为:


<brok:textload>
<ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3">
<ewus:numer_pesel>ASKED_PESEL</ewus:numer_pesel>
<ewus:system_swiad nazwa="client-eWUŚ" wersja="1.0.0"/>
</ewus:status_cwu_pyt>
</brok:textload>

我有

<ns0:textload>
<numer_pesel>PESEL</numer_pesel>
<system_swiad/>
</ns0:textload>
</ns0:payload>

我已经解决了:

payLoadH = zeep.xsd.Element('{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}none',  zeep.xsd.ComplexType([
zeep.xsd.Element(
'{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}status_cwu_pyt', zeep.xsd.ComplexType([
zeep.xsd.Element(
'{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}numer_pesel', zeep.xsd.String()),
zeep.xsd.Element('{https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v3}system_swiad', zeep.xsd.ComplexType([
zeep.xsd.Attribute('nazwa', zeep.xsd.String()),
zeep.xsd.Attribute('wersja',zeep.xsd.String())
])
)
])
)
])
)
payLoadH_=payLoadH({'numer_pesel':login,'system_swiad':{'nazwa':'AFYA_Python3','wersja':'1.0.0'}})

最新更新