PB调用WebService方式总结

测试WebService接口

WebService地址:http://localhost:7777/pbservice/testsrv.asmx?wsdl
接口定义: public function string addstr (string s1, string s2)
方法名:addstr
入参类型:字符串s1 和 s2
返回值:两个字符串入参拼接的结果
使用SoapUI工具调试接口,参数s1传入abc,参数s2传入def,返回两个字符串拼接结果 abcdef
在这里插入图片描述

SOAP协议调用

oleobject连接SOAP对象,再调用WebService定义的方法

oleobject ole_ws
string ls_address
string ls_s1,ls_s2,ls_return

//地址及调用参数
ls_address = "http://localhost:7777/pbservice/testsrv.asmx?wsdl"
ls_s1 = "abc"
ls_s2 = "def"

//连接SOAP对象
ole_ws = create oleobject
if ole_ws.ConnectTonewObject("MSSOAP.SoapClient30") < 0 then
	if ole_ws.ConnectTonewObject("MSSOAP.SoapClient") < 0 then
		throw create runtimeerror
	end if
end if

//初始化WebService地址
ole_ws.mssoapinit(ls_address)

//调用方法
ls_return = ole_ws.addstr(ls_s1,ls_s2)

//断开连接、销毁对象
ole_ws.DisconnectObject()
destroy ole_ws

return 0

代码执行结果如下
在这里插入图片描述

HTTP方式调用SOAP

SOAP本质上是一种HTTP POST方法的接口,使用基于XML格式的消息交互,因此可以用通过HTTP接口的方式来调用SOAP
XML格式的交互消息可以在浏览器中输入接口地址看到
在这里插入图片描述
在这里插入图片描述

通过inet对象调用

首先创建n_internetresult类

$PBExportHeader$n_internetresult.sru
forward
global type n_internetresult from internetresult
end type
end forward

global type n_internetresult from internetresult
end type
global n_internetresult n_internetresult

type variables
private:
	blob d
	string s
end variables
forward prototypes
public function integer internetdata (blob data)
public function blob getdata ()
public function integer internetstatus (string status)
end prototypes

public function integer internetdata (blob data);d = data

return 0
end function

public function blob getdata ();return d
end function

public function integer internetstatus (string status);s= status

return 0
end function

on n_internetresult.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_internetresult.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on


调用代码如下

inet linet
n_internetresult ln_ir
string ls_url
string ls_headers
string ls_args
blob lblb_args
uint li_port
blob lblb_result
string ls_result

ls_args = '<?xml version="1.0" encoding="utf-8"?>'+&
				'<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/">'+&
				'  <soap:Body>'+&
				'    <addstr xmlns="http://tempurl.org">'+&
				'      <s1>abc</s1>'+&
				'      <s2>def</s2>'+&
				'    </addstr>'+&
				'  </soap:Body>'+&
				'</soap:Envelope>'

//设置调用参数
ls_url = "http://localhost:7777/pbservice/testsrv.asmx"
ls_headers = "Content-Type:text/xml; charset=utf-8"
lblb_args = blob(ls_args,EncodingUTF8!)
li_port = 7777

//创建inet对象和internetresult对象
GetContextService("Internet", linet)
ln_ir = create n_internetresult

//调用接口
linet.PostURL(ls_url,lblb_args,ls_headers,li_port,ln_ir)

//获取返回值
lblb_result = ln_ir.getdata()
ls_result = string(lblb_result,EncodingUTF8!)

return 0

在这里插入图片描述

通过XMLHTTP调用

oleobject ole_http
string ls_url
string ls_args
string ls_result

//设置地址及调用参数报文
ls_url = "http://localhost:7777/pbservice/testsrv.asmx"
ls_args = '<?xml version="1.0" encoding="utf-8"?>'+&
				'<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/">'+&
				'  <soap:Body>'+&
				'    <addstr xmlns="http://tempurl.org">'+&
				'      <s1>abc</s1>'+&
				'      <s2>def</s2>'+&
				'    </addstr>'+&
				'  </soap:Body>'+&
				'</soap:Envelope>'

ole_http = create oleobject

//连接XMLHTTP、设置HTTP参数
ole_http.ConnectToNewObject( "Msxml2.XMLHTTP")
ole_http.Open("POST",ls_url,True)
ole_http.setRequestHeader("Content-Type","text/xml;charset=UTF-8")

//调用接口
ole_http.Send(ls_args)
Do While ole_http.readyState <> 4 //查询状态,延时
	Yield()
Loop

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

return 0

在这里插入图片描述

HTTP方式直接调用

HTTP POST直接调用的参数,在浏览器中输入接口地址可以看到,如下图红框部分
在这里插入图片描述

通过inet对象调用

inet linet
n_internetresult ln_ir
string ls_url
string ls_headers
string ls_args
blob lblb_args
uint li_port
blob lblb_result
string ls_result

ls_args = 's1=abc&s2=def'

//设置调用参数
ls_url = "http://localhost:7777/pbservice/testsrv.asmx/addstr"
ls_headers = "Content-Type:application/x-www-form-urlencoded"
lblb_args = blob(ls_args,EncodingUTF8!)
li_port = 7777

//创建inet对象和internetresult对象
GetContextService("Internet", linet)
ln_ir = create n_internetresult

//调用接口
linet.PostURL(ls_url,lblb_args,ls_headers,li_port,ln_ir)

//获取返回值
lblb_result = ln_ir.getdata()
ls_result = string(lblb_result,EncodingUTF8!)

return 0

在这里插入图片描述

通过XMLHTTP调用

oleobject ole_http
string ls_url
string ls_args
string ls_result

//设置地址及调用参数报文
ls_url = "http://localhost:7777/pbservice/testsrv.asmx/addstr"
ls_args = "s1=abc&s2=def"

ole_http = create oleobject

//连接XMLHTTP、设置HTTP参数
ole_http.ConnectToNewObject( "Msxml2.XMLHTTP")
ole_http.Open("POST",ls_url,True)
ole_http.setRequestHeader("Content-Type","application/x-www-form-urlencoded")

//调用接口
ole_http.Send(ls_args)
Do While ole_http.readyState <> 4 //查询状态,延时
	Yield()
Loop

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

return 0

在这里插入图片描述

PB WebService代理调用

工程项目内拷贝对应版本的pbsoapclient pbd文件以及pbsoapclient pbx文件
并将pbd文件添加到target下
这两个文件可以在PB安装路径 Sybase\Shared\PowerBuilder文件夹内找到
在这里插入图片描述
按提示流程创建WebService代理,这里命名为ws_test
在这里插入图片描述
如果创建过程中PB崩溃,可以拷贝已有的WebService代理,修改目标服务和其他属性
在这里插入图片描述
工程目录下右键WebService代理,选择Deploy,生成代理对象testsrvsoap
可以看到代理对象中存在目标方法,可以像调用普通PB对象的方法一样调用WebService代理对象的方法
在这里插入图片描述
下面是调用实例代码

soapconnection conn 
testsrvsoap ws
string ls_wsdl
string ls_result

ls_wsdl = "http://localhost:7777/pbservice/testsrv.asmx?wsdl"

//创建SOAP连接对象,连接地址
conn = create soapconnection
conn.createinstance(ws,"testsrvsoap",ls_wsdl)

//调用接口
ls_result = ws.addstr("abc","def")

//销毁对象
destroy conn
return 0

在这里插入图片描述

说明

inet调不了https接口
几种http的方式,入参和出参都是组装在报文中,需要相应的方法解析
PB8及以下版本没有WebService代理对象
http协议调用soap1.1,content-type为text/xml
http协议调用soap1.2,content-type为application/soap+xml

项目中要根据实际情况,选择简单适用的方式

发现BUG请留言或私信,以便修正(QQ:768310524 TEL:18649713925)

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值