python 使用spyne发布webservice 使用suds调用webservice示例
import logging
import socket
import json
import suds
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
from suds.client import Client
from suds.sax.element import Element
from suds.sax.attribute import Attribute
from spyne.application import Application
from spyne.decorator import rpc
from spyne import ServiceBase, Iterable, Integer, Unicode
from spyne.protocol.soap import Soap11, Soap12
from spyne.server.wsgi import WsgiApplication
from wsgiref.simple_server import make_server
from xml.dom.minidom import Document
class HimapWSManager:
__himapwsurl = 'http://127.0.0.1:8080/himapws/CallServicePort?wsdl'
__timeout = 30
def __CallService(self, sProcessName, sRequestXml):
client = Client(self.__himapwsurl, timeout=self.__timeout)
#logging.info('调用流程:%s,请求包:%s' % (sProcessName, sRequestXml))
result = client.service.callService("", sProcessName, sRequestXml, "admin", "fr4t3t1y6s6s1e0502c4d5")
#logging.info('调用流程:%s,接收包:%s' % (sProcessName, result))
return result
def __TextIsNull(self, textValue, defaultValue=''):
return textValue if textValue else defaultValue
def __AddRequestChild(self, doc, parent, child_name, child_value):
text = doc.createTextNode(child_value)
child_node = doc.createElement(child_name)
child_node.appendChild(text)
parent.appendChild(child_node)
def __ParseChargingDetailInterChangeXml(self, responsexml):
try:
root = ET.fromstring(responsexml)
except BaseException as e:
raise BaseException(e.message)
response = {}
returncode = root.find('RETURNCODE').text
codetext = root.find('CODETEXT').text
if returncode != 'SUCCEED':
response['Success'] = '0'
response['ErrorMessage'] = self.__TextIsNull(codetext, '失败')
response['InvoiceNumber'] = ''
response['ChargeDate'] = ''
else:
response['Success'] = '1'
response['ErrorMessage'] = self.__TextIsNull(codetext, '成功')
response['InvoiceNumber'] = self.__TextIsNull(root.find('response/InvoiceNumber').text)
response['ChargeDate'] = self.__TextIsNull(root.find('response/ChargeDate').text)
return response
def __ParseSynchronizeChargingDetailXml(self, responsexml):
try:
root = ET.fromstring(responsexml)
except BaseException as e:
raise BaseException(e.message)
response = []
returncode = root.find('RETURNCODE').text
codetext = root.find('CODETEXT').text
if returncode != 'SUCCEED':
record = {}
record['Success'] = '0'
record['ErrorMessage'] = self.__TextIsNull(codetext, '失败')
response.append(record)
else:
for Item in root.findall('response'):
record = {}
record['DetailedChargesId'] = self.__TextIsNull(Item.find('DetailedChargesId').text)
record['HospCode'] = self.__TextIsNull(Item.find('HospCode').text)
record['His_Keyno'] = self.__TextIsNull(Item.find('His_Keyno').text)
record['ChargeCode'] = self.__TextIsNull(Item.find('ChargeCode').text)
record['Success'] = self.__TextIsNull(Item.find('Success').text)
record['ErrorMessage'] = self.__TextIsNull(Item.find('ErrorMessage').text)
record['InvoiceNumber'] = self.__TextIsNull(Item.find('InvoiceNumber').text)
record['ChargeDate'] = self.__TextIsNull(Item.find('ChargeDate').text)
response.append(record)
return response
def CallChargingDetailInterChange(self, sHisId, sApplyNumber, sChargeJson, sApplyJson):
logging.info('收费请求,HisId:%s,ApplyNumber:%s' % (sHisId, sApplyNumber))
doc = Document() # 创建DOM文档对象
root = doc.createElement('request') # 创建根元素
doc.appendChild(root) # 根节点插入doc树
self.__AddRequestChild(doc, root, 'sHisId', sHisId)
self.__AddRequestChild(doc, root, 'sApplyNumber', sApplyNumber)
self.__AddRequestChild(doc, root, 'sChargeJson', sChargeJson)
self.__AddRequestChild(doc, root, 'sApplyJson', sApplyJson)
docxml = doc.toprettyxml()
requestxml = docxml.replace('<?xml version="1.0" ?>', '')
# requestxml = '<request><sHisId>?</sHisId><sApplyNumber>?</sApplyNumber><sChargeJson>?</sChargeJson><sApplyJson>?</sApplyJson></request>'
responsexml = self.__CallService('PROC_PA_CENTER_CHARGE', requestxml)
responsejson = json.dumps(self.__ParseChargingDetailInterChangeXml(responsexml), ensure_ascii=False)
logging.info('收费返回,HisId:%s,ApplyNumber:%s,JsonStr:%s' % (sHisId, sApplyNumber, responsejson))
return responsejson
def CallSynchronizeChargingDetail(self, sHisId, sApplyNumber, sChargeJson):
logging.info('同步请求,HisId:%s,ApplyNumber:%s' % (sHisId, sApplyNumber))
doc = Document() # 创建DOM文档对象
root = doc.createElement('request') # 创建根元素
doc.appendChild(root) # 根节点插入doc树
self.__AddRequestChild(doc, root, 'sHisId', sHisId)
self.__AddRequestChild(doc, root, 'sApplyNumber', sApplyNumber)
self.__AddRequestChild(doc, root, 'sChargeJson', sChargeJson)
docxml = doc.toprettyxml()
requestxml = docxml.replace('<?xml version="1.0" ?>', '')
# requestxml = '<request><sHisId>?</sHisId><sApplyNumber>?</sApplyNumber><sChargeJson>?</sChargeJson></request>'
responsexml = self.__CallService('PROC_PA_CENTER_CHARGE_DETAIL', requestxml)
responsejson = json.dumps(self.__ParseSynchronizeChargingDetailXml(responsexml), ensure_ascii=False)
logging.info('同步返回,HisId:%s,ApplyNumber:%s,JsonStr:%s' % (sHisId, sApplyNumber, responsejson))
return responsejson
class HimapWSProvider(ServiceBase):
@rpc(Unicode, Unicode, Unicode, Unicode, _returns=Unicode)
def ChargingDetailInterChange(self, sHisId, sApplyNumber, sChargeJson, sApplyJson):
himapwsmanager = HimapWSManager()
return himapwsmanager.CallChargingDetailInterChange(sHisId, sApplyNumber, sChargeJson, sApplyJson)
@rpc(Unicode, Unicode, Unicode, _returns=Unicode)
def SynchronizeChargingDetail(self, sHisId, sApplyNumber, sChargeJson):
himapwsmanager = HimapWSManager()
return himapwsmanager.CallSynchronizeChargingDetail(sHisId, sApplyNumber, sChargeJson)
application = Application([HimapWSProvider], 'http://schemas.xmlsoap.org/soap/envelope', in_protocol=Soap11(validator='lxml'), out_protocol=Soap11())
wsgi_application = WsgiApplication(application)
if __name__ == '__main__':
# result = ParseChargingDetailInterChangeXml(xml_charge)
# print(result)
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s:%(message)s')
logging.getLogger('spyne.protocol.xml').setLevel(logging.INFO)
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
port = 8081
logging.info('wsdl service url: http://%s:%d/HimapWSProvider?wsdl' % (ip, port))
server = make_server(ip, port, wsgi_application)
logging.info("service startup successfully")
server.serve_forever()