文档转自:http://baijiahao.baidu.com/s?id=1570870755451373&wfr=spider&for=pc
提起Powerbuiler这个工具来,现在还能知道的人还真不多。先简单解释一下吧,以下是从百度百科上复制下来的一段文字
PowerBuilder美国Sybase公司研制的一种新型、快速开发工具,是客户机/服务器结构下,基于Windows3.x、Windows95和WindowsNT的一个集成化开发工具。它包含一个直观的图形界面和可扩展的面向对象的编程语言PowerScript,提供与当前流行的大型数据库的接口,并通过ODBC与单机数据库相连。
当然了这也已经老黄历了,从当年的人见人爱(当然了也没那么夸张),到现在的卖艺又卖身(Sybase卖身给了SAP,现在SAP又把Powerbuiilder给了正阳--APPEON).这玩意儿现在也就还剩下医疗行业这一块根据地了,没办法现在流行BS应用,而这恰恰是Powerbuilder的短板。
好了啰嗦了这么多,下面开始进入正题。本人是混医疗圈的,对于一家医院来说要上系统的话,什么his lis pacs ris等等,就是产品线再全的公司有时候也一定能一家就搞定所有系统,所以总会遇到多个系统之间进行数据交互的时候,按照现在的行情,首选自然是Webservice。以下就是Powerbuilder调用其他系统接口常用的两种方法。
方法一(这也是Powerbuilder推荐的方法)
1.在Powerbuilder上点击File->New->Project->Web Service Proxy Wizard
2.如下图所示,填上Webservice的地址点Next
3.下图直接点Next
4.同样,下图继续Next
5.下图红框圈起来的地方填上前缀(不填也行)
6.下图直接Next
7.选择保存代理的pbl
8.下图是上面所做选择的最终结果,需要修改的话直接Back回去修改,否则还是直接Next
9.上面结束以后,菜单Design->Deploy Project,然后将Webservice的方法生成到本地(红框中圈起来的部分)
10.下图是调用Webservice的结果(以http://www.webxml.com.cn上查询手机号归属地的Webservice为例)
11.以下是具体的实现代码
String ls_phone,retmsg,ls_area
testmobilecodewssoap webTest
String ls_webTest = 'testmobilecodewssoap'
String ls_url = 'http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl'
soapconnection conn
conn = Create soapconnection
ls_phone = Trim(sle_1.Text)//手机号
Try
conn.CreateInstance(webTest,ls_webTest,ls_url)
Catch(soapexception re1)
retmsg = "调用失败1,错误号码:" + re1.getmessage()
Catch(runtimeerror re2)
retmsg = "调用失败2,错误号码:" + re2.getmessage()
End Try
MessageBox("提示",retmsg)
Return
ls_area = webTest.getmobilecodeinfo(ls_phone,'')
Catch(runtimeerror re3)
retmsg = "调用失败3,错误号码:" + re3.getmessage()
Destroy(conn)
mle_1.Text = ls_area
方法二:
上面的方法一是使用Powerbuilder推荐的生成代理的方式来调用。但对于这么一个”历史悠久”的工具来说,由于历史原因不是每家都是用的是最新的版本。首先来说上面的方法是从9.0开始支持的,从10以后开始逐渐加强(截止到现在最新版本是12.6).9.0对Webservice的支持并不怎么好,而恰恰目前用的比较多的就是9.0这个版本。在与其他系统交互数据时如果使用方法一的话基本上就得拼人品碰运气了。呵呵,所以下面介绍另外一种方法
首先使用第三方工具抓取Webservice的格式(本例使用soapUI来抓取)
1.菜单File->New soapUI Project,输入Webservice
2.下图就是抓取的结果
数据格式如下:问号就是要输入的参数
?
?
2.下图就是实现方法(代码如下)
string ls_xml,result,ls_phone,as_approve=''
Long ll_length,li_create,li_return
ls_phone = trim(sle_1.text)
ls_xml= ''
ls_xml+=''
'
'
'
'+ls_phone+'
ls_xml+=''
OLEObject http
http = Create OLEObject
li_create = http.ConnectToNewObject( "Msxml2.XMLHTTP.6.0")
If li_create <> 0 Then
li_create = http.ConnectToNewObject( "Msxml2.XMLHTTP.3.0")
End If
ll_length = Len(ls_xml)
http.Open("POST",ls_url,True)
http.setRequestHeader("Content-Type","text/xml;charset=UTF-8")
http.setRequestHeader("Content-Length",String(ll_length))
http.setRequestHeader("Authorization","auth="+as_approve)
http.Send(ls_xml)
Do While http.readyState <> 4 //查询状态,延时
Yield()
Loop
result = http.responseText
http.DisconnectObject()
Destroy http
mle_1.Text = Mid(result,Pos(result,'')+25,Pos(result,'') - Pos(result,'') - 25)
以上就是Powerbuilder调用Webservice的两种方法,其实还有其他方法,这里就不再写了。如果您使用的是10以上版本,推荐使用方法一,如果是10以下的话,还是用方法二吧。
最后顺带提一句,对于使用.Net的人来说很喜欢使用WCF来搞这个,但是WCF搞出来的东西虽然很像Webservice,但还是有区别的,而且使用上面两种方法也是都调用不成功的,要想解决,可以使用微软的SoapToolkit来处理。