python调用siebel的webservice(2种方法)

来源:互联网 发布:数据库 sql语句 基础 编辑:程序博客网 时间:2024/06/03 19:50

目前主要在维护的系统是siebel,其实时接口方式基本都是webservice,而其中又以inbound接口居多。外系统技术开发人员在初次对接siebel接口时,经常会遇问我怎么写siebel接口,无奈我也不了解java,.net等技术也帮不上忙。正好最近在学习python,就来尝试一下调用siebel的webservice接口。

通过这一两天的摸索,通过2种方式实现了siebel webservice的调用。第一种方式是最基础的,使用httplib模块,此种方式不需要本地wsdl文件。贴代码吧

import sys, httplibSM_TEMPLATE = """<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Body><m:Query xmlns:m="http://siebel.com/asi/BYM"><ContactId xsi:type="xsd:string">%s</ContactId></m:Query></SOAP-ENV:Body></SOAP-ENV:Envelope>"""SoapMessage = SM_TEMPLATE%("1-IO8-2667")webservice = httplib.HTTP("110.100.108.131")webservice.putrequest("POST", "/eai_anon_chs/start.swe?SWEExtSource=AnonWebService&SWEExtCmd=Execute HTTP/1.0")webservice.putheader("Host", "110.100.108.131")webservice.putheader("User-Agent", "Python post")webservice.putheader("Content-type", "text/xml; charset=\"UTF-8\"")webservice.putheader("Content-length", "%d" % len(SoapMessage))webservice.putheader("SOAPAction", "\"rpc/http://siebel.com/asi/BYM:Query\"")#webservice.putheader("SOAPAction", "rpc/http://siebel.com/asi/BYM:Query")webservice.endheaders()webservice.send(SoapMessage)print webservice.getreply()resmessage = webservice.getfile().read()ErrCode = resmessage[resmessage.find('<ErrCode>') +9 :resmessage.find('</ErrCode>')]ErrDesc = resmessage[resmessage.find('<ErrDesc>') +9 :resmessage.find('</ErrDesc>')]OutXml = resmessage[resmessage.find('<OutXml>') +8 :resmessage.find('</OutXml>')]OutXml = OutXml.replace('<','<').replace('>','>')print 'ErrCode = ',ErrCodeprint 'ErrDesc = ',ErrDescprint 'OutXml = ',OutXml
结果如下:


网络上还有很多其它第三方模块实现webservice的访问。比如suds,soapy,SOAPpy等。我想通过调用本地的siebel wsdl文件来访问webservice,通过搜索没有发现使用suds,soapy模块调用wsdl文件的实例,SOAPpy的有一个。下载了SOAPpy安装包后,进入目录执行python setup.py install 提示安装成功。在C:\Python27\Lib\site-packages\easy-install.pth中可以看到有一行./soappy-0.12.22-py2.7.egg,且该目录下可以看到这个egg文件。代码非常简单:

from SOAPpy import WSDLimport sys, httplib_url = 'C:/Users/huxiangyang/Desktop/UAT WSDL/CRMContact360WS.WSDL'soapmsg = WSDL.Proxy(_url)soapmsg.show_methods()
<pre style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);"><span style="background-color:#ffe4ff;">inmessage</span> = {<span style="color:#008000;"><strong>'ContactId'</strong></span>:<span style="color:#008000;"><strong>'1-IO8-2667'</strong></span>}soapmsg.Query(<span style="background-color:#e4e4ff;">inmessage</span>)


可以看到方法名叫Query,入参是1个string类型的ContactId,出参是3个string类型的。最后在如何调用方法上卡住了,查了很多也试了很多一直报类型错误。后来发现SOAPpy里可以设置debug参数,只要加一句话就行
SOAPpy.Config.debug = 1
这样就能看到发送出去的SOAP 消息啦,原来Body里面多了一对标签v1,导致格式不对了。

后来发现直接在Query方法中指定ContactId等于XXX就不会出现v1标签,好吧先这样。

soapmsg.Query(ContactId='1-IO8-2667')
然后发现报错信息变了,这次变成不包含有效的Web服务了。

content-type= text/xml;charset=UTF-8
data= <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>不存在包含 &apos;http://siebel.com/asi/BYM:IOQueryPage&apos; 操作的有效 Web 服务。(SBL-EAI-04313)</faultstring><detail><siebelf:siebdetail xmlns:siebelf="http://www.siebel.com/ws/fault"><siebelf:logfilename>EAIObjMgr_chs_0014_14680107.log</siebelf:logfilename><siebelf:errorstack><siebelf:error><siebelf:errorcode>SBL-EAI-04313</siebelf:errorcode><siebelf:errorsymbol>IDS_EAI_WS_OP_NOT_FOUND</siebelf:errorsymbol><siebelf:errormsg>不存在包含 &apos;http://siebel.com/asi/BYM:IOQueryPage&apos; 操作的有效 Web 服务。(SBL-EAI-04313)</siebelf:errormsg></siebelf:error></siebelf:errorstack></siebelf:siebdetail></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
*** Incoming HTTP headers **********************************************
HTTP/1.? 500 Internal Server Error
Date: Fri, 29 Apr 2016 07:58:57 GMT
Server: Oracle-Application-Server-11g
eaihttprespstatus: 500
经过对比,发现这里的SOAP Header里面比用XML Spy生成的Header里面多了一句话,SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/",把这句加到XML Spy生成的soap header里面也报一样的错,看来就是因为这句话导致这个报错。那么让SOAPpy生成的SOAP Header里面把这句话去掉呢?首先定位到产生SOAP Header的源代码文件\src\SOAPpy\SOAPBuilder.py,修改代码为

'''_env_top = ( '%(ENV_T)s:Envelope\n' + \                 '  %(ENV_T)s:encodingStyle="%(ENC)s"\n' ) % \                 NS.__dict__'''    _env_top = ( '%(ENV_T)s:Envelope\n' ) % NS.__dict__

然后需要重新编译SOAPpy,然后再重新安装SOAPpy。 编译使用命令 python setup.py build。卸载SOAPpy直接去C:\Python27\Lib\site-packages目录下,把easy-install.pth文件中soappy那一行去掉,然后把那个soappy.egg文件删除即可。安装执行命令python setup.py install即可。

至此,第2种方法终于可以成功调用了。



1 0
原创粉丝点击