pb开发webservice怎么做,pb调用webservice详细步骤
PowerBuilder(PB)调用WebService的核心在于实现非托管代码与托管环境的数据交互,最稳健的方案是利用PB原生提供的WebServiceProxy向导生成代理对象,结合.NET引擎或EasySoap组件完成通信。整个开发流程的核心结论是:必须严格保证WSDL接口定义与PB数据类型的一致性,并正确配置运行时环境,否则极易出现调用失败或数据乱码。
环境准备与核心组件选择
在开始pb开发webservice的实际操作前,环境配置是决定成败的基石,PB本身并不具备直接解析SOAP协议的能力,它依赖外部引擎。
- 引擎选择:PB11.5及以上版本通常内置了对.NETWebService的支持,在创建代理时,建议优先选择.NET引擎而非旧版的EasySoap,EasySoap对复杂类型(ComplexType)的支持较弱,且在处理中文编码时容易出现不可控的乱码问题,而.NET引擎兼容性更强,支持SOAP1.2协议。
- 运行时依赖:开发环境中必须安装.NETFramework(建议4.0及以上版本),部署时,目标机器也必须安装对应的.NET运行时,这是很多开发者容易忽略的“坑”。
- WSDL文件获取:确保获取到最新的WSDL地址或文件,WebService的接口变更往往只体现在WSDL中,PB端不会自动感知,一旦接口变更,必须重新生成代理。
创建WebServiceProxy代理对象
这是实现调用的关键步骤,代理对象充当了PB与WebService之间的桥梁。
- 打开PowerBuilder开发环境,点击菜单栏
File->New,选择Project标签页。 - 选中
WebServiceProxyWizard,点击OK启动向导。 - 指定WSDL位置:输入WebService的URL地址(以?wsdl结尾)或本地WSDL文件路径,点击“Next”后,PB会解析该文件。
- 选择服务与端口:解析成功后,向导会列出可用的Service和Port,通常一个WSDL包含多个端口,需根据业务需求选择正确的服务端口。
- 设置代理库:建议将生成的代理对象存放在一个独立的PBL库中,便于管理和后续更新。
- 前缀设置:为生成的对象设置前缀(如
ws_),避免与系统对象或自定义对象重名。
生成完成后,系统会在指定的PBL中创建一个自定义类用户对象,该对象包含了WebService中定义的所有方法。
编写调用代码与实例化逻辑
代理对象生成后,不能直接像普通函数那样调用,必须通过代码进行实例化并建立连接。
-
实例化连接对象:PB提供了一个
SoapConnection对象用于建立连接。SoapConnectionconnlongll_retws_myserviceproxy_obj//假设生成的代理对象名为ws_myserviceconn=createSoapConnection -
配置连接参数:如果WebService部署在内网或需要代理服务器访问,需调用
SetProxyServer方法,对于HTTPS服务,可能需要忽略证书错误或配置证书路径。//设置超时时间,单位毫秒,防止网络阻塞导致程序假死conn.SetTimeout(30000) -
创建代理实例:使用
CreateInstance方法将代理对象与连接绑定。ll_ret=conn.CreateInstance(proxy_obj,"ws_myservice")ifll_ret<>0thenmessagebox("错误","创建代理实例失败,错误码:"+string(ll_ret))returnendif -
调用方法:实例化成功后,即可通过代理对象调用WebService方法。
stringls_result//假设WebService有一个HelloWorld方法ls_result=proxy_obj.HelloWorld("TestUser")messagebox("返回结果",ls_result)
复杂数据类型处理与编码陷阱
这是pb开发webservice过程中最棘手的部分,PB的数据类型与WebService使用的XMLSchema(XSD)并非一一对应。
- 简单类型映射:String对应String,Int对应Long,Decimal对应Decimal。注意Date和DateTime的区别,PB的Date类型不包含时间,若接口要求DateTime,必须使用PB的DateTime类型或字符串拼接。
- 复杂类型:当WebService的参数是一个类对象时,PB生成的代理会自动创建对应的结构体。务必检查生成的结构体字段顺序是否与WSDL一致,如果WSDL中字段是必填,PB端必须赋值,否则SOAP包校验不通过。
- 中文乱码解决方案:很多开发者遇到返回的中文显示为乱码,这通常是因为XML编码声明与实际传输编码不符。
- 解决方案:检查WebService服务端的编码格式(通常是UTF-8),如果PB端显示乱码,可尝试在调用前使用
SoapConnection对象的SetEncoding方法,或者在生成的代理对象源码中,手动修改XML声明部分的编码格式。推荐统一使用UTF-8编码,并在PB脚本中配合Blob转换函数处理特殊字符。
- 解决方案:检查WebService服务端的编码格式(通常是UTF-8),如果PB端显示乱码,可尝试在调用前使用
- 数组处理:当接口返回数组时,PB代理通常会将其映射为结构体数组,在遍历数组前,务必判断数组是否为空(UpperBound检查),避免数组越界错误。
异常捕获与日志调试
WebService调用涉及网络传输,稳定性至关重要。不能仅依赖PB的系统错误捕获,必须引入SOAP级别的异常处理。
- Try-Catch机制:所有调用代码必须包裹在
Try...Catch...EndTry块中。tryls_result=proxy_obj.GetData()catch(SoapExceptione)//捕获SOAP协议层面的错误,如服务器500错误messagebox("SOAP异常",e.text)catch(RuntimeErrore)//捕获PB运行时错误messagebox("运行时错误",e.text)endtry - 日志追踪:在开发阶段,开启PB的
Trace功能至关重要。conn.SetTraceFile("c:pb_ws_trace.log") 该日志文件会记录完整的SOAP请求包和响应包,当调用报错时,打开日志文件查看原始XML是定位问题的最权威手段,通过查看请求包,可以确认PB是否正确发送了参数;通过查看响应包,可以确认服务端是否返回了错误信息。
部署与发布注意事项
开发完成后的部署环节,往往因为环境差异导致失败。
- DLL依赖:如果使用.NET引擎,发布包中必须包含相关的.NETDLL文件(如
Sybase.PowerBuilder.WebService.Runtime.dll等,具体取决于PB版本),这些文件通常位于PB的共享目录下。 - 配置文件:某些调用需要
app.config文件来配置绑定方式,确保该文件随主程序一同发布。 - 防火墙与权限:确保客户端机器能够访问WebService的端口(如80、8080或443),如果是调用外网服务,Windows防火墙可能会拦截出站请求。
pb开发webservice的本质是利用中间层代理屏蔽底层SOAP协议的复杂性,开发者只需遵循“配置环境-生成代理-实例化连接-处理数据-捕获异常”的标准流程,重点关注数据类型映射与字符编码问题,即可在PowerBuilder中稳定集成现代WebService接口,让遗留系统焕发新生。