首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python - zeep - WSDL连接/该怎么做?

Python - zeep - WSDL连接/该怎么做?
EN

Stack Overflow用户
提问于 2019-09-12 19:26:30
回答 1查看 2.2K关注 0票数 0

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

我通过以下方式获得凭据:

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
client2 = zeep.Client(wsdl=ewus_service, transport=transport)
client2.wsdl.dump()

我会变得:

代码语言:javascript
运行
复制
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

现在我应该生成如下所示的内容:

代码语言:javascript
运行
复制
<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保存到一个文件中,将其放在正确的位置,例如#%,然后动态地将值插入到正确的位置,然后将其作为原始数据发送到服务器。我想把它做得很优雅。如何使用zeep生成上述文件,如何完成数据: Auth Token,PESEL,date of generation?

现在我有很多东西:

代码语言:javascript
运行
复制
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)

直到现在我都不知道该怎么办!请帮帮我!我发现了像这样的东西

代码语言:javascript
运行
复制
config = client.type_factory('ns3').loginParams()
print(config)

更新2019/9/13

到目前为止,我有这样的想法:

代码语言:javascript
运行
复制
'''
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)

我现在不知道我做错了什么

代码语言:javascript
运行
复制
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

但我认为,我的payloadH出了问题,因为:如果我这样做了:

代码语言:javascript
运行
复制
node = client2.create_message(
    client2.service, 'executeService', location=location_,date=dt,payload=payLoad_,_soapheaders=soapheaders)
print("NODE:>>",lxml.etree.tostring(node))

我会变得:

代码语言:javascript
运行
复制
<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>

如你所见:我应该成为:

代码语言:javascript
运行
复制
            <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>

而且我有

代码语言:javascript
运行
复制
<ns0:textload>
<numer_pesel>PESEL</numer_pesel>
<system_swiad/>
</ns0:textload>
</ns0:payload>
EN

回答 1

Stack Overflow用户

发布于 2019-09-13 16:39:35

我已经解决了:

代码语言:javascript
运行
复制
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'}})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57905700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档