关于PB调用Webservice的有效方法

Powerbuilder调用Webservice客户端总是有很多限制,PB的proxy方法使用起来有很多限制,对复杂数据类型支持不好。INET方法使用时,对于PB9以下版本存在字符集的问题,PB9使用的是ANSI单字节字符集,而soap XML使用的UTF8字符集,当参数或返回值有汉字时,必须使用转码操作才能正常显示,再加上PB对webservice支持并不好,所以使用INET效率不高。本人认为使用MSXML2.XMLHTTP对象能够有效解决后台Webservice后台服务平台不同导致客户端使用不便的问题。网上有许多XMLHTTP开发经验,但源码使用均有不少BUG。本人在开发过程中实际操作使用,源码未经修改。由于使用XMLHTTP对象涉及SOAP协议文本封装问题,一般人员很难正确组装,因此借用SoapUI工具,可以快速查看有效SOAP封装后的语句,复制黏贴到程序中稍加修改即可使用。

SOAPUI截图

关于PB调用Webservice的有效方法

然后将运行左侧内容贴出,在程序中直接使用,PB中的代码如下:

//使用微软的MSXML控件开发,采用http/soap协议


oleobject ole_http
string ls_url
string ls_args
string ls_result
long  li_create

//设置地址及调用参数报文
ls_url = "http://123.128.101.199:4000/prefront/services/prefrontWebService?Wsdl"
ls_args =  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.prefront.msun.com/"> ' + &
   '<soapenv:Header/> ' + & 
   '<soapenv:Body>  ' + & 
    '  <web:getPatientInfo> ' + & 
       '  <arg0>{"hospitalId":"","medicalCardNumber":"8E3A4276984CAC78F226AF08AC32F32C0970F09CA64AB321942C"}</arg0> ' + & 
     ' </web:getPatientInfo> '  + & 
   ' </soapenv:Body>  ' + & 
' </soapenv:Envelope> ' 

ole_http = create oleobject

//连接XMLHTTP、设置HTTP参数,优先使用高版本
li_create = ole_http.ConnectToNewObject( "Msxml2.XMLHTTP.4.0")
If li_create <> 0 Then
   li_create = ole_http.ConnectToNewObject( "Msxml2.XMLHTTP.3.0")
End If
If li_create <> 0 Then
   li_create = ole_http.ConnectToNewObject( "Msxml2.XMLHTTP")
End If
// 使用POST,WebService 均使用HTTP/POST事件而没有GET
ole_http.Open("POST",ls_url,True)
//设置使用的文本内容格式及字符集
ole_http.setRequestHeader("Content-Type","text/xml;charset=UTF-8")
//ole_http.setRequestHeader("Content-Type","application/x-www-form-urlencoded")

//SEND XML文本,该文本经过前期组装
ole_http.Send(ls_args)
Do While ole_http.readyState <> 4 //查询状态,延时
    Yield()
Loop

//获取返回、销毁对象
ls_result = ole_http.responseText()
ole_http.DisconnectObject()
if isvalid(ole_http) then Destroy ole_http

由于采用soap底层协议,该方法适用于大多数PB的Webservice客户端的开发,不必担心Webservice后台服务由什么工具开发,也无需担心complex type 导致的问题。由于采用微软的XMLparse工具,兼容性较高,本人在使用PB的Webservice Proxy 和Mssoap Client30开发失败后,采用此方法开发成功。PB的INET采用soap协议开发也可以成功,但运行效率不如使用MSXML工具。