• / 22
  • 下载费用:12 金币  

OracleWebservice接口开发.doc

关 键 词:
OracleWebservice 接口 开发
资源描述:
\\Oracle EBS接口开发之通过DBWS包实现webserviceAuthor:苏南生E-Mail:nansheng.su#hand-china.comCreation Date:December 27, 2014Last Updated:December 27, 2014Document Ref: Version:DRAFT 1AApprovals: Copy Number_____Document ControlChange Record3DateAuthorVersionChange Reference2014-12-27snansDraft 1aNo Previous DocumentReviewersNamePositionDistributionCopy No.NameLocation1Library MasterProject Library2Project Manager34Note To Holders:If you receive an electronic copy of this document and print it out, please write your name on the equivalent of the cover page, for document control purposes.If you receive a hard copy of this document, please write your name on the front cover, for document control purposes.ContentsDocument Controlii1.Webservice21.1 一个案例21.2 模拟测试31.3 什么是WebService31.4 WebService平台技术42.DBWS包62.1 DBWS62.2 下载安装63.XML103.1 为什么要说XML103.2 命名空间的引入103.3 命名空间的声明与使用114.XPath134.1 Xpath简介134.2 XPath路径表达式135.Oracle 解析带有命名空间的XML185.1 XMLTABLE185.2 extract186.信保通对接代码示例197.Open and Closed Issues for this Deliverable20Open Issues20Closed Issues201. Webservice1.1 一个案例1) 案例功能:通过输入IP地址查询国家、城市、所有者等信息。2) 返回数据: 一个一维字符串数组String(1),String(0) = IP地址;String(1) = 查询结果或提示信息3) 案例地址:http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?op=getCountryCityByIp4) WSDL地址:http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl请求数据格式:POST /WebServices/IpAddressSearchWebService.asmx HTTP/1.1Host: webservice.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://WebXml.com.cn/getCountryCityByIp" string 返回数据格式:HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length string string 1.2 模拟测试1) 软件模拟:通过SOAP协议,发送请求2) 软件模拟:接收返回的数据由于软件的编码缺陷,这边第二个标签内容为:”中国 移动”3) 附件:案例软件包通过以上的软件模拟,我们已经大概知道了Webservice的大概交互方式和作用。1.3 什么是WebService其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。 WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。1.4 WebService平台技术XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。XML+XSD: WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。 XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。SOAP: WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。 SOAP协议 = HTTP协议 + XML数据格式 SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。WSDL: 好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。 WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。2. DBWS包2.1 DBWSOracle在9i时代就发布了扩展包来支持PL/SQL访问Web Services,并且在Oracle 10g版本中使得该功能变得更加强大;这都源于引入了UTL_DBWS包,其实它是封装了JPublisher,使得PL/SQL开发者只需要使用简单的几个API就能调用Web Services了。2.2 下载安装1. 检查是否已经安装utl_dbws包SQL> desc sys.utl_dbws ERROR: ORA-04043: object sys.utl_dbws does not exist2. 检查数据库中java classes 的状态--2.检查数据库中java classes 的状态SELECT owner, status, count(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE='JAVA CLASS' GROUP BY owner, status; OWNER STATUS COUNT(*)------------------------------ ------- ----------APPS VALID 4576MDSYS VALID 564SYS VALID 24722ODM VALID 264ORDSYS VALID 1876--如果存在INVALID状态的失效类,可以运行$ORACLE_HOME/rdbms/admin/utlrp.sql,来修复3. 下载最新的dbwsclient.jar文件Pre 10g: dbws-callout-utility.zip (10.1.2)10g: dbws-callout-utility-10R2.zip (10.1.3.0)10g, 11g & 12c latest: dbws-callout-utility-10131.zip (10.1.3.1)附件:我这边的数据库为R11.24. 解压下载的文件,切换到sqlj\lib目录,得到所有jar。5. 以Oracle的用户登录数据库服务器,切换到“$ORACLE_HOME/sqlj/lib”目录,并把上一步解压得到的jar包,放在该文件夹下。6. 设置OJVM pool size,如果没有设置,可能会在安装jar包的时候报错。我第一次安装的时候就没设置。结果安装过程中出现java的pool size太小的错误。--6.1 查看OJVM pool size大小SQL> show parameter SHARED_POOL_SIZE NAME TYPE VALUE ---------------------- shared_pool_size big integer 0SQL> show parameter JAVA_POOL_SIZE NAME TYPE VALUE ----------------------- java_pool_size big integer 0--6.2 设置SQL> alter system set SHARED_POOL_SIZE=400M scope=both; System altered. SQL> alter system set JAVA_POOL_SIZE=200M scope=both; System altered.7. 安装# 安装到 SYS schema.export PATH=$ORACLE_HOME/bin:$PATHcd $ORACLE_HOME/sqlj/lib# 10gR2loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar# 11g and 12cloadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb11.jar# 安装到非 SYS schema.export PATH=$ORACLE_HOME/bin:$PATHcd $ORACLE_HOME/sqlj/lib# 10gR2loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar# 11g & 12cloadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb11.jar8. 安装utl_dbws package到下载解压目录,可以得到utl_dbws_body.sql 和 utl_dbws_decl.sql,在SYS用户下安装这个PACKAGESQL> @utl_dbws_declSQL> @utl_dbws_bodySQL> CREATE PUBLIC SYNONYM utl_dbws FOR sys.utl_dbws;SQL> GRANT EXECUTE ON sys.utl_dbws TO apps;9. 测试脚本如果已经安装完成以上步骤,我们可以通过如下实例来检验我们的Oracle是否已经成功安装DBWS包。新建一个FUNCTION,作用是:接收两个数值,然后程序调用Webservice,计算两个number的和。CREATE OR REPLACE FUNCTION add_numbers (p_int_1 IN NUMBER, p_int_2 IN NUMBER) RETURN NUMBERAS l_service UTL_DBWS.service; l_call UTL_DBWS.call; l_wsdl_url VARCHAR2(32767); l_namespace VARCHAR2(32767); l_service_qname UTL_DBWS.qname; l_port_qname UTL_DBWS.qname; l_operation_qname UTL_DBWS.qname; l_xmltype_in SYS.XMLTYPE; l_xmltype_out SYS.XMLTYPE; l_return NUMBER;BEGIN l_wsdl_url := 'http://oracle-base.com/webservices/server.php?wsdl'; l_namespace := 'http://wwworacl323ces/'; --l_service_qname := UTL_DBWS.to_qname(l_namespace, 'Calculator'); --l_port_qname := UTL_DBWS.to_qname(l_namespace, 'CalculatorPort'); l_operation_qname := UTL_DBWS.to_qname(l_namespace, 'ws_add'); l_service := UTL_DBWS.create_service ( wsdl_document_location => URIFACTORY.getURI(l_wsdl_url), service_name => l_service_qname); l_call := UTL_DBWS.create_call ( service_handle => l_service, port_name => l_port_qname, operation_name => l_operation_qname); l_xmltype_in := SYS.XMLTYPE(' ' || p_int_1 || ' ' || p_int_2 || ' '); l_xmltype_out := UTL_DBWS.invoke(call_Handle => l_call, request => l_xmltype_in); UTL_DBWS.release_call (call_handle => l_call); UTL_DBWS.release_service (service_handle => l_service); l_return := l_xmltype_out.extract('//return/text()').getNumberVal(); RETURN l_return;END;运行如下SQL:SELECT add_numbers(1,5) from dual;输出:6代表安装成功。报错则失败。3. XML3.1 为什么要说XML本次总结Webservice是在开发信保通接口时学习和总结的内容。信保通使用Webservice进行数据交互。当我们安装完DBWS包以后,我们就可以使用DBWS的API和信保通通信。但是XML数据返回的内容包含命名空间,对我们的Oracle解析XML造成影响。所以总结下XML的命名空间。--返回XML的部分样例:对账单查询2014-12-22T15:36:28+08:0011589919对账单查询2014-12-22T09:39:16+08:00115896883.2 命名空间的引入比如有两份 XML 数据 Unmi
fantasia@sina.com
Unmi
Gaoxin Nanyi Road, NanShan District, Shenzhen
集成在一起时就是 Unmi
fantasia@sina.com
Gaoxin Nanyi Road, NanShan District, Shenzhen
注意到上面,此时计算机是基本无法分辨是何种 address。当然,你说分别换成 不行了吗?但这要修改 DTD 文件,也许你没权利修改这些个 DTD 文件,即使行的话,同样再来个别的 address 是不又要修改 DTD 文件?由此就引入了命名空间 (Namespace) 分别来区分以上那两个 address,甚至更多的 address。有了命名空间,你不必改写 DTD,命名空间一般会用一个 URI 来标定唯一性。加入命名空间后完成 XML 文件如下: Unmi fantasia@sina.com Gaoxin Nanyi Road, NanShan District, Shenzhen 3.3 命名空间的声明与使用前面那个 XML 可读性是增强了,但如果我们用浏览器打开上面的XML,会报找不到命名空间的错误:所以我们要声明命名空间,有两种声明方式 (1) 显式声明,(2) 默认式声明1) 显式声明在用到命名空间 (缩写为 ns) 标记 (缩写为 tag) 的外层 (祖先,但通常写在根标记上) 标记中声明,语法如下: 然后为 XML 文件中每个标记都加上命名空间(也就是前缀,以下前缀与命名空间等同),修正好的 XML 内容如下 Unmi fantasia@sina.com Gaoxin Nanyi Road, NanShan District, Shenzhen 我们为 XML 文档中出现的每一个标记都使用了前缀,IE 中再次打开,不会有问题了。这里要记住命名空间的关键声明部分语法为 xmlns:ns="URI"。2) 默认式声明是不是觉得上面那个写法太烦琐了,的确。所以就有了默认声明方式,让不带前缀的标签从属于默认命名空间""。声明语法如下 与显式声明的语法只第一行有差异,把两种形式的第一行拿出来就是 Unmi fantasia@sina.com
Gaoxin Nanyi Road, NanShan District, Shenzhen
还有,即使是用了显式声明命名空间语法,如果其中仍有未带前缀的标签存在,其实那个标签也是在一个默认的命名空间中,只是没有明确告诉你一个默认的 URI,也许这时默认的 URI 是 ""。如下: Unmi fantasia@sina.com Gaoxin Nanyi Road, NanShan District, Shenzhen < name > 既不在 earth 中,也不在 net 中,它其实也是在默认的命名空间中,是 ""关于 xmlns 那个 URI 说明一点,它只是被借用来唯一标识的名称,看似网址,你可以在那个网页里随意写些东西,或许根本不可到达。4. XPath4.1 Xpath简介XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和 XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年。W3C关于XPath的英文 详细文档请见:http://www.w3.org/TR/xpath20/ 。 XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath2.0是XPath1.0的超集。它 是对XPath1.0的扩展,它可以支持更加丰富的数据类型,并且XPath2.0保持了对XPath1.0的相对很好的向后兼容性,几乎所有的 XPath2.0的返回结果都可以和XPath1.0保持一样。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查询定位节点的主表达 式语言。XQuery1.0是对XPath2.0的扩展。关于在XSLT和XQuery中使用XPath表达式定位节点的知识在后面的实例中会有所介绍。 在学习XPath之前你应该对XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父 (Parent),子(Children),兄弟(Sibling),先辈(Ancestor),后代(Descendant)等概念有所了解。这里不在说明.4.2 XPath路径表达式1. /AAA基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始,那么该路径就表示到一个元素的绝对路径。                                                                                                      2. /AAA/CCC选择AAA的所有CCC子元素                                                                                                       3. /AAA/DDD/BBB选择AAA的子元素DDD的所有子元素BBB                                                                                                       4. //BBB如果路径以双斜线 // 开头,则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)。                                                                                                                                                                                  5. //DDD/BBB选择所有父元素是DDD的BBB元素                                                                                                                                                                             6. /AAA/CCC/DDD/*星号 * 表示选择所有由星号之前的路径所定位的元素选择所有路径依附于/AAA/CCC/DDD的元素                                                                                                                                                                                                                                                                                                                                                                                                                        7. /*/*/*/BBB选择所有的有3个祖先元素的BBB元素                                                                                                                                                                                                                                                                                                                                                                                                                         8. //*选择所有元素                                                                                                                                                                                                                                                                                                                                                                                                                         9. /AAA/BBB[1]方块号里的表达式可以进一步的指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。 10. //@id选择所有的有id 属性的元素 11. //BBB[@id='b1'] 5. Oracle 解析带有命名空间的XML5.1 XMLTABLEXML脚本: test1 test2 test3XML解析:SELECT xmlt.* FROM test_xmltype, xmltable(xmlnamespaces('http://www.exam.com/uri1' AS "ns1"), '$root/a' passing test_xmltype.xml AS "root" columns b VARCHAR2(500) path 'ns1:b', c VARCHAR2(500) path 'ns1:c', d VARCHAR2(500) path 'ns1:d' ) AS xmlt;5.2 extractSELECT t.xml.extract('/a/ns1:b/text()','xmlns:ns1="http://www.exam.com/uri1"').getStringval() from test_xmltype t; 6. 信保通对接代码示例DECLARE l_service utl_dbws.service; l_call utl_dbws.call; l_wsdl_url VARCHAR2(32767); l_namespace VARCHAR2(32767); l_service_qname utl_dbws.qname; l_port_qname utl_dbws.qname; l_operation_qname utl_dbws.qname; l_xmltype_in sys.xmltype; l_xmltype_out sys.xmltype; l_return VARCHAR2(1000);BEGIN l_wsdl_url := 'http://192.168.0.103:8888/ediDemoforjava/ws_services/SolEdiBaseInfoWebService?wsdl'; l_namespace := 'http://service.edi.exchange.sinosure.com'; l_service_qname := utl_dbws.to_qname(l_namespace, 'SolEdiBaseInfoWebService'); --l_port_qname := UTL_DBWS.to_qname(l_namespace, 'CalculatorPort'); l_operation_qname := utl_dbws.to_qname(l_namespace, 'doEdiAccountList'); l_service := utl_dbws.create_service(wsdl_document_location => urifactory.geturi(l_wsdl_url), service_name => l_service_qname); l_call := utl_dbws.create_call(service_handle => l_service, port_name => l_port_qname, operation_name => l_operation_qname); l_xmltype_in := sys.xmltype(' ' || '1' || ' '); l_xmltype_out := utl_dbws.invoke(call_handle => l_call, request => l_xmltype_in); utl_dbws.release_call(call_handle => l_call); utl_dbws.release_service(service_handle => l_service); INSERT INTO test_snans (CLOB) VALUES (l_xmltype_out.getclobval()); /*l_return := l_xmltype_out.extract('//ns1:doEdiAccountListResponse/ns1:out/ns2:Account/calltime/text()').getStringVal(); dbms_output.put_line(l_return); */END;7. Open and Closed Issues for this DeliverableAdd open issues that you identify while writing or reviewing this document to the open issues section. As you resolve issues, move them to the closed issues section and keep the issue ID the same. Include an explanation of the resolution.When this deliverable is complete, any open issues should be transferred to the project- or process-level Risk and Issue Log (PJM.CR.040) and managed using a project level Risk and Issue Form (PJM.CR.040). In addition, the open items should remain in the open issues section of this deliverable, but flagged in the resolution column as being transferred.Open IssuesIDIssueResolutionResponsibilityTarget DateImpact DateClosed IssuesIDIssueResolutionResponsibilityTarget DateImpact Date
展开阅读全文
  语墨文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:OracleWebservice接口开发.doc
链接地址:http://www.wenku38.com/p-145201.html

                                            站长QQ:1002732220      手机号:18710392703    


                                                          copyright@ 2008-2020 语墨网站版权所有

                                                             经营许可证编号:蜀ICP备18034126号

网站客服微信
收起
展开