PowerBuilder9.0 使用xmlhttp组件调用webservice

这篇工作笔记记录了如何使用PowerBuilder 9.0中的XMLHTTP组件替代pbsoapclient.pbd来调用DRGS接口。通过创建OLEObject,构造SOAP报文,设置请求头并发送POST请求,最后解析返回的XML数据。过程中解决了因不同PB版本导致的动态库不一致问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

病案管理DRGS接口的工作笔记
//-----------------------------------------------------------------------------------------------

 

今天在这里写个备忘录,以后用到可以当作参考

powerbuilder9.0自带的pbsoapclient.pbd,可以很方便的调用webservices,但是在目标电脑上经常发生运行时错误,
估计是多个pb版本造成的动态库版本不一致引起的。

于是改成使用xmlhttp组件来调用。

1.根据wsdl文件生成报文

2.根据报文例子,生成请求的body,代码如下 

//创建XMLHTTP控件--------------------------------------------------------------------------
http = Create OLEObject 
li_ret = http.ConnectToNewObject( "Msxml2.XMLHTTP")
If li_ret <> 0 Then
	li_ret  = http.ConnectToNewObject( "Msxml2.XMLHTTP.3.0")
End If
if(li_ret <> 0 )  then
	is_error = "Msxml2组件初始化失败!"
	return -1
end if 

//构造报文内容-----------------------------------------------------------------------------
ls_xml = "<?xml version=~"1.0~" encoding=~"utf-8~"?>" 
ls_xml += "<soap:Envelope xmlns:xsi=~"http://www.w3.org/2001/XMLSchema-instance~" xmlns:xsd=~"http://www.w3.org/2001/XMLSchema~" xmlns:soap=~"http://schemas.xmlsoap.org/soap/envelope/~">"
ls_xml += "<soap:Body>"
ls_xml += "<MedicalServiceXml xmlns=~"http://tempuri.org/~">"
ls_xml += "<serviceId>"+is_serviceid+"</serviceId>"
ls_xml += "<userId>"+UserID+"</userId>"
ls_xml += "<nonce>"+nonce+"</nonce>"
ls_xml += "<data>"+is_data+"</data>"
ls_xml += "<siginMethod>"+siginmethod+"</siginMethod>"
ls_xml += "<signData>"+signdata+"</signData>"
ls_xml += "</MedicalServiceXml>"
ls_xml += "</soap:Body>"
ls_xml += "</soap:Envelope>"
 
//转换编码格式UTF8-------------------------------------------------------------------------
CString Conver
Conver.ToUnicode(ls_xml,lblb_args)
ll_length = Len(lblb_args)

//提交请求---------------------------------------------------------------------------------
http.Open("POST",ls_url,True)
http.setRequestHeader("Content-Type","text/xml; charset=utf-8")
http.setRequestHeader("SOAPAction","http://tempuri.org/MedicalServiceXml")
http.setRequestHeader("Content-Length",String(ll_length)) 
http.setRequestHeader("Host","10.84.195.21")
http.Send(lblb_args)

//接收返回结果----------------------------------------------------------------------------- 
Do While http.readyState <> 4 //查询状态,延时
Yield()
Loop


node = http.responseXML.selectSingleNode("//MedicalServiceXmlResult")
if isnull(node) then 
		is_error = "返回报文无效!"
		return -1
end if 

//读取XML节点数据------------------------------------------------------------------- 
is_result  = string(node.text );  
http.DisconnectObject() 
Destroy http

if(is_result = "") then 
	is_error = "返回报文无效!"
	return -1 
end if 

return 0 
 

powerbuilder9.0真是一个好东东,非常的强大,超级好用啊。

pb11来了,大家的希望有了; 作者起初花了近一段的时间研究PB11,写点心得,希望大师们不要见笑: 感觉还是比较方便的和强大的,使用了AJAX技术,无刷新,用于做查询还是很不错的,(如果要求不高的话,做个小程序也可以,效率上不比一般的.NET程序差多少);但是倘若用在大的项目中,本人觉得可能还是需要值得商榷的,有兴趣的同仁可以研究研究; 2. WEBSERVICE: 因为之前有写过PB6的三层,因此也特意研究了一下PB11的WEBSERVICE, ,只要代码写的可以的话,在INTERNET上跑,感觉还是不错的,特别是WEBSERVICE+CS框架的二合一,更有效的决绝了对高性能要求; 我觉得基于pb11的最好的web解决方案是: pb程序(webservice)+IIS for .net框架 +客户端 或者是:pb程序+.net winform+智能客户端+IIS for .net框架 如果你想pb源代码执行不要受任何.net框架限制,就用第一种, 如果想用智能客户端,那可能还是要用第二种。非常建议用第二种。 最后讲一句,其实我觉得做企业应用,软件功能,客户的体验应该是最重要, 就像pb程序(webservice)+IIS for .net框架 +客户端 架构 ,就已经解决了程序安装维护的问题,大可不必再迷信和崇拜纯web的应用了。我觉得winform比web更适合企业级用户 补充: 经过几个月的努力,终于把PB11 WEBSERVICE 框架完成(除了没有封装动态调用存储过程外,已经封装了全部常用功能); 本想把客户端程序上传让大家测试,但是由于公司的WEB服务器上有其它正式的程序在用,所以暂时不准本把 SERVER端程序挂到该服务器上供大家测试,以免带来安全隐患,还请见谅 如有问题可以通过以下方式联系: 本代码非本人所写,在其他网站下载,仅供学习交流之用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿峰的编程博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值