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>)
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>不存在包含 'http://siebel.com/asi/BYM:IOQueryPage' 操作的有效 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>不存在包含 'http://siebel.com/asi/BYM:IOQueryPage' 操作的有效 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种方法终于可以成功调用了。
- python调用siebel的webservice(2种方法)
- webservice的调用方法
- 调用webservice的方法
- 动态调用WebService的两种方法(多线程)
- 几种调用WebService的方法
- 几种调用WebService的方法
- WebService的几种调用方法
- 几种调用WebService的方法
- 几种调用WebService的方法
- 几种调用WebService的方法
- js调用WebService的几种方法
- 几种调用webservice的方法
- js调用WebService的几种方法
- java 调用webservice的几种方法
- [转]几种调用WebService的方法
- php调用webservice的几种方法
- webService调用的几种方法
- php调用webservice的几种方法
- iOS自带AVPlayer视频播放器
- 【数据结构与算法】B/B+ 树 、RB树
- 【Effective C++读书笔记】篇二(条款02~条款04)
- SqlServer性能监控和优化总结
- 让自己也能使用Canvas
- python调用siebel的webservice(2种方法)
- NSIS进阶教程(一)~(五)
- 跨域的三种方法总结:代理,JSONP,以及XHR2
- Java 的多线程访问常见异常--fast-lost (快速失败 )
- 百度定位
- [剑指Offer]把数组排成最小的数
- Java 简单的BFS爬虫
- 第 1 章 初识 jQuery
- 程序员的开始