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