PB调用WebService方式总结

文章目录

  • 测试WebService接口
  • SOAP协议调用
  • HTTP方式调用SOAP
    • 通过inet对象调用
    • 通过XMLHTTP调用
  • HTTP方式直接调用
    • 通过inet对象调用
    • 通过XMLHTTP调用
  • 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
PB调用WebService方式总结_第1张图片

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

代码执行结果如下
PB调用WebService方式总结_第2张图片

HTTP方式调用SOAP

SOAP本质上是一种HTTP POST方法的接口,使用基于XML格式的消息交互,因此可以用通过HTTP接口的方式来调用SOAP
XML格式的交互消息可以在浏览器中输入接口地址看到
PB调用WebService方式总结_第3张图片
PB调用WebService方式总结_第4张图片

通过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 = ''+&
				''+&
				'  '+&
				'    '+&
				'      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

PB调用WebService方式总结_第5张图片

通过XMLHTTP调用

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

PB调用WebService方式总结_第6张图片

HTTP方式直接调用

HTTP POST直接调用的参数,在浏览器中输入接口地址可以看到,如下图红框部分
PB调用WebService方式总结_第7张图片

通过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

PB调用WebService方式总结_第8张图片

通过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方式总结_第9张图片

PB WebService代理调用

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

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

PB调用WebService方式总结_第13张图片

说明

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)

你可能感兴趣的:(PB调用WebService方式总结)