pb调用webservice
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
webserv ice服务器端会提供ws dl接口文档,pb里面用we b service proxy wizard从wsdl 生成对象,再调用即可(注意把c:\program files\sybase\shared\powerbu ilder下面的pbso apclie nt90.pbd加入ta rget),代码样例:
SoapCon nectio n lsc_con n
soapser vice lproxy_obj
String ls_prox y_name = "soapser vice "//生成的代理对象名称
String ls_url = "http://localho st:8080/axis/service s/SoapSer vice "//web service url
//
lsc_con n = Create SoapCon nectio n
lsc_con n.SetOpti ons( "SoapLog=~ "soaplog.txt~ " ")
int li_ret,i
li_ret = lsc_con n.Createi nstanc e( lproxy_obj, ls_prox y_name, ls_url)
If li_ret<> 0 Then
Message Box( "错误", "调用失败,错误号码: " + String(li_ret))
Return
End If
tns1__r equest conten t lst_req uest
lst_req uest.arg1 = 5
lst_req uest.arg2 = "test "
tns1__r eturnr esult lst_res ult
lst_res ult = lproxy_obj.GetResu lt(lst_req uest)
Message Box(String(lst_res ult.result), "code: " + lst_res ult.reason.code + "~nmessag e: " + &
lst_res ult.reason.message + "~ndesc: " + lst_res ult.reason.desc )
注意pb调用w ebserv ice只能返回简单的in t string类型,复杂的结构会出错
怎么样在pb9里面调用We bServi ce
pb9也出来了,速度够快的,大概看了一下,与pb8比较,增加的功能不多,主要是WebService,Xml和Ejb.我就感受了一下p b9的We bServi c e功能,与大家共享。
我们用一个实例来说明:
新建应用,这些步骤与pb8一致的。
然后建立一个W e bServ i ce Proxy Wizard,下一步会提示你输入WSDL文件,点击浏览选择,假设是C:\inetpub\wwwroot\的servic e1.wsdl文件。
点击下一步,会自动出现WS DL文件中的S ervic e.点击下一步,系统默认选择S e rvice Soap,紧接着输入proxy name(代理对象名),输入test_ws.后面的几项按默认即可。
完成后是编译代理对象的界面。
会出现:
Web Service Generat or Project Status
Deploym ent PBL: E:\program\pb\webserv ice\w_app.pbl
Clear PBL on build: No
Confirm overwri tes: No
WSDL Locatio n: file://E:\program\pb\webserv ice\service1.wsdl
Service s selecte d :
Service Service1:
Service1Soap
可以在属性中设置,也可以不用去管。
点击编译的绿色图标,好了,一个代理对象生成了。
在左边的tre eview中可以看到如:test_wsservice1soap的东西。
点击加号的图标,在functi on中可以看到里面的我们定义的sho w(stringyournam e) returns string.
好了最重要的一步已经完成了,我们来测试一下:
建一个wind ows,添加一个文本框和按钮控件。
在cb_1.click事件写入:
SoapCon nectio n conn
Test_ws servic e1soap test_ws
long rV al
//stringstr_end point
//str_end point= "http://localho st/webserv er/service1.asmx?WSDL"
conn = createSoapCon nectio n
rVal = Conn.CreateI nstanc e(test_ws, "test_ws servic e1soap")
sle_1.text = test_ws.show("你的参与是我们最大的支持")
destroy conn
好了,保存,会提示Soap Connection未定义。
增加PBSoapClien t90.pbd到库列表中。
PBSoapClient90.pbd在pb安装目录下Shared\PowerB u i lder。
增加后左边treeview会出现soa pconne ction,SOAP server
soapexception两个对象.
运行,点击按钮,文本框中出现h t tp://www.ourfly.com欢迎你的参与是我们最大的支持
注意的是:Service1.asmx文件在服务器上是可以运行的,否则不会出现东西的。
添加PBSoapClien t90.pbd和引用w e bserv i ce
作者:feique123 2009-10-10 15:06 星期六晴
1、PBSoapClient90.pbd在pb安装目录下Shared\PowerBuilder。
在pb的tre e中的target 属性中添加。
增加后左边treeview会出现soa pconne ction,SOAP server soapexception两个对象.。
2、在一个按钮的c l i ck事件中写的如下例子。
SoapCon nectio n conn
Test_ws servic esoaptest_ws
long rV al
conn = createSoapCon nectio n
rVal = Conn.CreateI nstanc e(test_ws, "test_ws servic esoap")
sle_1.text =string(test_ws.jihe("select* from t_user", "t_user"))
destroy conn
注:test_ws为代理对象名
3、要想在pb中用webservi ce必须要建一个we bservi c e,其引用的wsd l文件,应该是pb所在机器上访问到的wsdl文件,也就是所能访问的webse rvice服务。
PBDOM操作X ML文档轻松入门(Easy XML with PowerBuilder Documen t ObjectModel) (作者:Terry V oth、JohnStrano)
(根据http://www.sybase.com/sb_cont ent/1027266/XML_PB_DOM.pdf 翻译整理)
本文对PBDO M技术进行相关介绍,但并不涉及XM L的基础知识,建议阅读者对下述相关术语有一定了解:Documen t(文档), DTD(文档类型定义), schema(大纲),Element (元素), attribu te(属性), processi ng instruction(处理命令), entity(实体)。
本文主要包括以下内容:
1、为什么要使用P B DOM以及怎样创建PB DOM
2、PBDOM主要用于那些地方
3、如何使用PBD OM编程
4、PBDOM和其他XML解析(parser)技术的比较
一、什么是DOM
◆文档对象模型(D ocumen t ObjectModel)
1、作为一项W3C规范,XML DOM存在目的是为不同类型的应用程序提供一个标准的编程接口,它被设计可以跨平台、跨语言使用。
2、我们可以利用X ML DOM创建XM L文档并操纵其结构,增加、修改、删除元素。
3、程序中调用XML解析器载入XML文档到内存中。
当文档被载入后,可以通过进入D OM 检索和操作相关信息。
4、DOM 保存了XML文档树,文档(documen t)元素位于整棵树的最顶层。
该元素可以有一到多个子节点来保存树的结构。
可以参阅以下网站:http://www.w3schoo l /dom/ 来了解更多的关于XML Documen t ObjectModel的内容。
二、什么时候应该使用DOM工具
◆当你需要做下列事情的时候,你应该想到XML DOM的
1、在一个或者多个X ML文档之间移动元素
2、创建新的元素并且在XML文档的任意位置插入
3、操作元素并重新插入其到XM L文档其他位置
4、导入内嵌数据结构
& . pb9中,数据窗口现在可以通过XML导出内嵌数据结构(nesteddata structu res).
三、什么是PBDO M
◆PowerBuilder文档结构模型(P owerBuilder Documen t ObjectModel)
1、PBDOM是通过PBNI扩展出来的,用于操作XML数据,并针对Powe rScrip t作了优化
2、在程序中模型是通过DOM的抽象来表示X M L数据。
(A program ming model to represe nt
XML data –an abstraction of DOM)
3、底层是对Apa che Xerces/C++的封装。
四、PBDOM的设计目标
1、简单易用(Be straigh tforwa rd for PowerBuilder p rogram mers)
2、可以利用PowerScri pt的强大语言能力(如对象、方法重载、数据等)
3、在可能的情况下,隐藏了XML底层的复杂实现(Hide the complexi tiesof XML whereve r possibl e)
4、原有的DOM在pb下使用不够直观(DOM is unintui tive to a PowerBuilder p rogram mer)
五、使用PBDOM初步
◆PBDOM设置
1、添加pbdom90.pbd(%SYBASE%\Shared\PowerBui lder)到工程的pbl列表中
2、%SYBASE%\Shared\PowerBuilder应该在系统路径或者应用程序的路径中(也就是pbdo m 要使用此路径下的pbd om90.dll, pbxerce s90.dll、xerces_2_1_0.dll文件,同样,当程序发布时候也需要)
六、PBDOM类的使用
◆如图所示,反映了PBDOM类的组成和继承关系,可以看到,几乎所有的PB DOM类都继承自PBDO M_Obje ct(除了PBDOM_Build er和PBDOM_Exception)
1、PBDOM_D ocumen t
◆构建PBDOM举例
1.1 直接构建(XML documen t s can be created from scratch)
PBDOM_D ocumen t doc
PBDOM_E lement rootdoc = CREATEPBDOM_D ocumen t
root = CREATEPBDOM_E lement
root.SetName( "root" )
root.SetText( "this is the root" )
doc.AddCont ent( root )
1.2 从文件、字符串、DataSto re中载入
PBDOM_B uilder builder
doc = builder.BuildFr omStri ng( "<foo>bar</foo>" )
doc = builder.BuildFr omFile( "c:\foo\bar.xml"
doc = builder.BuildFr omData Store( l_ds)
2、PBDOM_Element
2.1 遍历元素
PBDOM_E lement root, childre n[], first
// Get the root element of the documen t
root = doc.GetRoot Elemen t()
// Get an array of all child element s
root.GetChil dEleme nts( childre n )
// Get only element s with a given name
root.GetChil dEleme nts( "name", childre n )
// Get the first element with a given name
first = root.GetChil dEleme nt( "name" )
注意:
上例中得到的元素数组是联动的!(The element array is live!)即:
◆修改数组中的元素,同样会作用到父文档
◆返回的数组是有界的(Once the array is returne d, it is now bounded)
◆在数组中增加新元素时,需要一个Set Conten t()方法调用
2.2 移动元素
// PBDOM_D ocumen t docOne,docTwo
PBDOM_E lement movable
movable = CREATEPBDOM_E lement
Movable.SetName( "movable" )
docOne.AddCont ent( movable ) // add
movable.Detach() // remove
docTwo.addCont ent( movable ) // add again
注意:
1、只要是从PBD OM_Obj ect继承的对象,都可以调用De tach()方法(如Commen t s、Proces s i ngInstructi ons、Element s (and their content)等等)
2、PBDOM元素对象不是永久的捆绑在它的父文档上的(PBDOM element s aren't permane ntly tied to their parent documen t)
2.3 符合规格(Always well-formed)
PBDOM_Element构造器以及s etter方法会检查元素是否符合规格:
elem.SetName( "Spacesare illegal" )
AddContent()方法也会从以下几个方面进行检查:
◆结构---树中没有循环(Structu re –no loops in any tree)
◆只有一个根节点元素(One and only one root element) ◆相容的命名空间(Consist ent namespa ces)
3、PBDOM_A ttribu te
3.1 操作元素属性
◆元素可以有多个属性
<table width="100%" border="0"></table>
// Get an attribu te
ls_widt h = table.GetAttr ibuteV alue( "width" ) // or
ls_widt h = table.GetAttr ibute( "width" ).GetText()
// Attribu tes can be typed
li_bord er = table.GetAttr ibute( "width" ).GetIntV alue()
// Set an attribu te
table.SetAttr ibute( "cellspa cing", "0" )
// Removean attribu te
table.RemoveA ttribu te( "cellspa cing" )
// Removeall attribu tes
PBDOM_A ttribu te empty[]
table.SetAttr ibutes( empty ) // the PowerSc ript way
4、PBDOM_Text
4.1 操作元素文本内容
<descrip tion>
cool demo
</descrip tion>
// the text is directl y availab le –returns
// "~r~ncool demo~r~n"
ls_desc= elem.GetText()
// two conveni ence methods
ls_desc= elem.GetText Trim()// returns "cool demo"
ls_desc = elem.GetText Normal ize()// returns "cool demo"
// text can be changed directl y
elem.SetText( "a new descrip tion" )
5、PBDOM_O bject
5.1 操作有混合内容的元素
<descrip tion>
<!–comment -->
<?convert units="metric" ?>
cool demo
</descrip tion>
PBDOM_O bjectcontent[]
desc.GetCont ent( content )
FOR i = 1 TO UpperBo und( content )
CHOOSEcontent[i].GetObje ctClas sStrin g()
CASE "pbdom_c omment"
// ...
CASE "pbdom_p rocess ingins tructi on"
// ...
END CHOOSE
NEXT
6、PBDOM_P rocessi ngInstructi on
6.1 使用处理命令(P rocessi ng instructions)
<? xml-stylesh eet type="text/xsl"href="foo.xsl" ?>
{------target------} {----------------data---------------}
// Get target(e.g., "xsl-stylesh eet")
ls_targ et = pi.GetTarg et()
// Get data (e.g., 'type="text/xsl"href="foo.xsl"')
ls_data = pi.GetText()
// Get individ ual valuesas attribu tes
Stringnames[]
pi.GetName s( names )
FOR i = 1 TO UpperBo und( names )
Message Box( names[i], pi.GetValu e( names[i] )
NEXT
7、PBDOM and 命名空间(Namespa ces)
<xsl:stylesh eet version="1.0" xmlns:xsl="/1999/XSL/Transfo rm"> <xsl:variabl e name="ffsecti on" select="//SITE_SE CTION
<xsl:templat e name="TopNav">
......
</xsl:templat e>
</xsl:stylesh eet>
Stringls_elem ent
PBDOM_E lement templat e
// get element name and namespa ce –return"xsl:templat e"
templat e = root.GetChil dEleme nt( "templat e" )
ls_elem ent= templat e.GetName spaceP refix() +":"+ templat e.Getname()
// get element by name and namespa ce
templat e = root.GetChil dEleme nt( "templat e", "xsl", "/1999/XSL/Transfo rm")
七、PBDOM vs. the Competi tion
◆ApacheXerces/COM
Xerces是现在PBDOM底层使用的XML解析器,但对PowerB uiler用户来说使用不直观。
(Xercesi s the [current] underly i ng XML parser for PBDOM, but is less intuiti ve)
◆MSXML
.无法在UNIX等操作系统上使用(No deploym ent to UNIX possibl e)
.同样对Powe rBuile r用户来说使用不够直观(L ess Intuiti ve)
.COM collecti ons vs. PB arrays (pb用户当然会优先选择使用数组来处理数据)
◆Others
Expat–a C DLL (使用时需要声明外部函数…使用不够广泛)。