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
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
SOAP本质上是一种HTTP POST方法的接口,使用基于XML格式的消息交互,因此可以用通过HTTP接口的方式来调用SOAP
XML格式的交互消息可以在浏览器中输入接口地址看到
首先创建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 = ''+&
''+&
' '+&
' '+&
' abc '+&
' def '+&
' '+&
' '+&
' '
//设置调用参数
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
oleobject ole_http
string ls_url
string ls_args
string ls_result
//设置地址及调用参数报文
ls_url = "http://localhost:7777/pbservice/testsrv.asmx"
ls_args = ''+&
''+&
' '+&
' '+&
' abc '+&
' def '+&
' '+&
' '+&
' '
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 POST直接调用的参数,在浏览器中输入接口地址可以看到,如下图红框部分
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
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
工程项目内拷贝对应版本的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)