通过数据库存储过程调用Web服务的办法
Web服务概览
Web服务,从广义而言,就是在两个应用或电子设备之间通过万维网通信的方法。Web服务有两种类型:简单对象访问协议(SOAP)以及表述性状态转移(REST)。
SOAP为基于XML的消息交换定义了一个标准的通信协议(一组规则)。SOAP使用不同的传输协议,如HTTP、JMS以及SMTP。标准协议HTTP可以让SOAP更容易地无需修改协议本身而在防火墙和代理之间穿越。因为使用冗长的XML格式,SOAP有时候会比CORBA或ICE这样的中间件技术更慢一些。
REST描述一组架构性原则,数据按照这些原则可通过标准接口(如HTTP)进行传输。REST并不包含额外的消息传递层,而是专注于设计规则,创建无状态服务。客户可利用URI访问资源,然后一个资源的表示会被返回。通过每个新资源的表述,就可以说客户已经状态转移了。RESTful资源是通过HTTP协议访问的,资源的URL充当了资源的标识符,而GET、PUT、DELETE、POST以及 HEAD是用于对资源进行标准的HTTP操作。
REST Vs. SOAP
在REST和SOAP之间选择特定类型的Web服务时,需要考虑多个因素。下表根据个人体验,详细列了每一种Web服务的各自特点。
REST
-RESTful web服务完全是无状态的。这一点可以通过重启服务器然后检查交互是否保持来验证。
-RESTful服务通过HTTP GET方法提供了一个很好的缓冲基础设施(对于大多数服务器而言)。在Web服务返回的数据不经常被修改且天生不是动态的情况下,这可以改善性能。
-服务的生产者和消费者需要对上下文以及被传递的内容有一个共同的理解,因为并没有一整套标准的规则来描述Web服务接口。
-REST对那些尺寸受限的设备,如手机和PDA尤其有用,相对而言这些设备像包头和其他SOAP元素之类的额外参数的总开销要更少。
-REST服务很容易与已有的网站集成,可通过XML开放,所以HTML页面很容易消费一样的东西。这几乎不需要对原有网站进行重构。由于开发者不需要白手起家重写一切,只需在原有功能上追加,这会使得开发者感觉更舒服、更有生产力。
-基于REST的实现相对于SOAP而言很简单。
SOAP
-Web服务描述语言(WSDL)包含和描述了一组共同的规则来定义Web服务的消息、绑定、操作以及位置。WSDL是定义Web服务所提供接口的一种正式合同。
-SOAP需要的样板代码比REST服务设计少(比方说事务、安全、协调、寻址、信任等)。大多数现实世界的应用都不是简单的,均支持复杂操作,这需要保持会话状态和上下文信息。SOAP方案中开发者不需要编写样板代码进应用层本身。
-SOAP Web服务(如JAX-WS)在处理异步流程和调用时很有用。
-SOAP支持若干协议和技术,包括WSDL、XSD、SOAP、WS-Addressing等。
一语蔽之,如果你要对外发布一个复杂的应用程序接口(API),SOAP会更有用。不过如果某件事情要求的学习曲线更平缓、更轻量、返回结果更快,且是简单事务(如增删改查操作)的话,我选REST。
通过Oracle数据库存储过程调用Web服务
通过数据库存储过程消费一项Web服务使得用户可通过不同来源的信息直接更新数据库。用户还可以定期调度任务去更新数据库中的数据。
Oracle提供了一项“utl http”实用工具来帮助实现这一点。下面是Oracle包提供给客户的一个样例代码,可以实现数据库对Web服务的调用。
调用Web服务面临的常见问题及解决方案
有时候哪怕是在存储过程中已经做完预期调用Web服务所需的一切,过程的编译也无法通过。下面就是一个调用Web服务存储过程执行时遇到的运行时错误及其解决方案汇编。
问题1:过程编译期间收到“ORA-25293 : HTTP request failed”错误
解决方案:按照以下步骤改正。
Login through sys user as sysdba.
View the privileges to the selected schema to use the utl_HTTP package by using the command as follows:
select grantee, table_name, privilege
from dba_tab_privs
where table_name = 'UTL_HTTP';
The grant will be provided to all the public users by default.
Revoke execute grant on utl_http from public and provide it explicitly to the specific schema from which the Web service needs to be invoked.
revoke execute on utl_http from public;
grant execute on utl_http to BTFT2;
select grantee, table_name, privilege
from dba_tab_privs
where table_name = 'UTL_HTTP';
问题2:如果存储过程调用Web服务时收到“Network access denied”。
解决方案:按一下步骤增加Web服务url给访问控制技术列表
Login through sys as sysdba.
Execute the following procedure to create ACL.
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => '<name of the acl file>.xml',
description => 'Permissions to access the web service url',
principal => '<Schema name>',
is_grant => TRUE,
privilege => 'connect');
COMMIT;
END;
/
Create a role and then grant connect to this role on the ACL by using the steps below:
create role role1;
BEGIN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
acl => '<name of the acl file>.xml',
principal => 'role1',
is_grant => TRUE,
privilege => 'connect',
position => null);
COMMIT;
END;
Assign the host names to the ACL to open all the related links in the host.
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl => '<name of the acl file>.xml',
host => '*.<host name of the webservice url>');
COMMIT;
END;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl => '<name of the acl file>.xml',
host => '<ip>’);
COMMIT;
END;
Confirm whether the domain has been added in the ACL using ACL_UTILITY package.
SELECT * FROM
TABLE(DBMS_NETWORK_ACL_UTILITY.DOMAINS('www.ajax.googleapis.com'));
select acl , host , lower_port , upper_port from DBA_NETWORK_ACLS;
select acl , principal , privilege , is_grant from BA_NETWORK_ACL_PRIVILEGES;
还有很多办法调用服务,如用JDeveloper或Oracle UTL_DWBS包。即将推出的新版Oracle还会有更多的选项和功能,因此数据库可以同时充当(服务)消费者和提供者。充分发挥这种办法的优势最终将会令数据库范式和操作全球化
TechTarget中国原创内容,原文链接:http://www.searchsoa.com.cn/showcontent_73554.htm?lg=t
通过数据库存储过程调用Web服务的办法相关推荐
- C#动态调用web服务 远程调用技术WebService
一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...
- 异步调用Web服务方法
基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下 ...
- 【随记】动态调用web服务
通常我们在程序中需要调用WebService时,都是通过"添加Web引用",让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web ...
- asmx 接受 ajax post,jQuery ajax调用web服务(asmx)触发认证弹出框
在我的asp.net 4.0电子商务web应用程序中,登录的客户可以点击锚点,如"过去6个月内的订单"或"订单去年"来查看他过去的订单.当点击这样的锚,我做一个 ...
- android10获取手机号码,【android,10】10.调用web服务获取手机号码归属地
一.调用 web 服务获取号码归属地: 1.设置布局: android:layout_width="fill_parent" android:layout_height=" ...
- GDC服务器主机与证书不匹配,调用web服务soap时,错误https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配...
嘿,我想用SAAJ调用soap web服务 我用野蝇10 我试图将此系统属性添加到standalone.xml,但无法工作 20: 53:08208错误[stderr](默认任务-21),原因是:ja ...
- ajax web服务调用无效 参数值,json调用web服务,报错,无参数值!
前台:ShowDetail("英伦学院派马夹"); function ShowDetail(productId) { // make an ajax call to the web ...
- Ajax异步调用Web服务的例子
我这里是看的Dflying Chen的使用ASP.NET AJAX异步调用Web Service和页面中的类方法的一系列文章写出来的例子. 请Dflying Chen别介意.例子中没有最后一篇文章的的 ...
- java se 7web_JAX-WS ::从独立的Java 7 SE客户端调用Web服务的方法
我正在尝试独立的JAX-WS Web服务,服务器和客户端(意思是,不在 Java EE容器内运行).显示独立服务器端的好SO帖子是 this one. 对于客户端,我发现了以下三种似乎有效的方法(使用 ...
最新文章
- php xdebug 中文手册,php 安装xdebug扩展
- 解决尺度不平衡,Facebook 全景分割新算法
- mysql中IFNULL(字段名,默认值) 给null设置默认值
- java 如何判断余数_用java判断一个数是不是回文数!
- 银联的bankall_阿尔法银行罗马尼亚分行开始受理银联卡
- 用python编辑word_使用PYTHON编辑和读取WORD文档
- CoffeeScript简介 一
- 1.6 logistic回归的keras实现
- c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
- 粒子群优化算法求解函数最值
- [Win10] 解决 Office 安装后图标空白的问题
- 使用中国电信物联网开发者平台的步骤总结
- Go语言 linux安装
- matlab textscan 分块读取,【转】matlab的textscan与textread区别
- 通过python scrapy shell 获取对应的网页元素值
- vue 打卡图片_掀起ins打卡潮的《小丑》台阶到底有什么魔力?
- C++初步之核心编程篇五:多态与虚函数类
- HTML 个人简历模板简易版
- GB 18030介绍及其与相关标准的比较-GBK与GB18030-2000
- 偶遇Chrome浏览器“喔唷,崩溃啦”,错误代码(STATUS_STACK_BUFFER_OVERRUN)
热门文章
- 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe
- 项目商业模式的设计与思考
- 最新2009年度长篇经典小说推荐列表
- sklearn 的基本机器学习(分类方法)
- hdu 1845(最大匹配)
- 【vulhub靶场】medium_socnet
- 寒假实习学习笔记总结
- 君澜酒店集团2019年度待开业“景澜”品牌酒店发布
- java计算机毕业设计数据分析星辰网智能手机销售网站源码+mysql数据库+系统+lw文档+部署
- 汇编语言-中括号-mov指令-cmp指令-lea指令