首页 Oracle-Webservice接口开发

Oracle-Webservice接口开发

举报
开通vip

Oracle-Webservice接口开发H:\fanwen caiji two\事迹报告怎样才能不落俗套_1.doc Oracle EBS接口开发之 通过DBWS包实现webservice Author: 苏南生 E-Mail: nansheng.su#hand-china.com Creation Date: December 27, 2014 Last Updated: December 27, 2014 Document Ref: Version: DRAFT 1A Approvals: Copy Number ...

Oracle-Webservice接口开发
H:\fanwen caiji two\事迹 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 怎样才能不落俗套_1.doc Oracle EBS接口开发之 通过DBWS包实现webservice Author: 苏南生 E-Mail: nansheng.su#hand-china.com Creation Date: December 27, 2014 Last Updated: December 27, 2014 Document Ref: Version: DRAFT 1A Approvals: Copy Number _____ Document Control Change Record 1 Date Author Version Change Reference 2014-12-27 snans Draft 1a No Previous Document Reviewers Name Position Distribution Copy No. Name Location 1 Library Master Project Library 2 Project Manager 3 4 Note 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. Contents iiDocument Control 21. Webservice 21.1 一个案例 31.2 模拟测试 31.3 什么是WebService 41.4 WebService平台技术 62. DBWS包 62.1 DBWS 62.2 下载安装 103. XML 103.1 为什么要说XML 103.2 命名空间的引入 113.3 命名空间的声明与使用 134. XPath 134.1 Xpath简介 134.2 XPath路径表达式 185. Oracle 解析带有命名空间的XML 185.1 XMLTABLE 185.2 extract 196. 信保通对接代码示例 207. Open and Closed Issues for this Deliverable 20Open Issues 20Closed Issues 1. Webservice 1.1 一个案例 1) 案例功能:通过输入IP地址查询国家、城市、所有者等信息。 2) 返回数据: 一个一维字符串数组String(1),String(0) = IP地址;String(1) = 查询结果或提示信息 3) 案例地址:http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?op=getCountryCityByIp 4) WSDL地址:http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl 请求数据 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 : POST /WebServices/IpAddressSearchWebService.asmx HTTP/1.1 Host: webservice.webxml.com.cn Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://WebXml.com.cn/getCountryCityByIp" string 返回数据格式: HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-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 DBWS Oracle在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 exist 2. 检查数据库中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 4576 MDSYS VALID 564 SYS VALID 24722 ODM VALID 264 ORDSYS 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.2 4. 解压下载的文件,切换到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 0 SQL> 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:$PATH cd $ORACLE_HOME/sqlj/lib # 10gR2 loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar # 11g and 12c loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb11.jar # 安装到非 SYS schema. export PATH=$ORACLE_HOME/bin:$PATH cd $ORACLE_HOME/sqlj/lib # 10gR2 loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar # 11g & 12c loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb11.jar 8. 安装utl_dbws package 到下载解压目录,可以得到utl_dbws_body.sql 和 utl_dbws_decl.sql,在SYS用户下安装这个PACKAGE SQL> @utl_dbws_decl SQL> @utl_dbws_body SQL> 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 NUMBER AS 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. XML 3.1 为什么要说XML 本次总结Webservice是在开发信保通接口时学习和总结的内容。信保通使用Webservice进行数据交互。当我们安装完DBWS包以后,我们就可以使用DBWS的API和信保通通信。但是XML数据返回的内容包含命名空间,对我们的Oracle解析XML造成影响。所以总结下XML的命名空间。 --返回XML的部分样例: 对账单查询 2014-12-22T15:36:28+08:00 1 1589919 对账单查询 2014-12-22T09:39:16+08:00 1 1589688 3.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. XPath 4.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 解析带有命名空间的XML 5.1 XMLTABLE XML脚本: test1 test2 test3 XML解析: 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 extract SELECT 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 Deliverable Add 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 Issues ID Issue Resolution Responsibility Target Date Impact Date Closed Issues ID Issue Resolution Responsibility Target Date Impact Date
本文档为【Oracle-Webservice接口开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
豆浆
暂无简介~
格式:doc
大小:241KB
软件:Word
页数:24
分类:工学
上传时间:2019-05-17
浏览量:87