REST vs. SOAP:如何挑选最好的Web服务

日期: 2013-05-29 作者:Swati Dhingra翻译:boxi 来源:TechTarget中国 英文

“我需要用多个供应商的存货信息来更新本地存货数据库。供应商提供的是基于Web服务的接口。由于应用没有任何服务器端的组件(应用是一个胖客户端,直接与数据库对话),有没有可能直接通过我的应用数据库直接使用这些Web服务?”   你是不是也受到类似问题的困扰?有没有想过此类问题的解决方案应该是怎样的?到目前为止,我们已经对从各种数据库获取数据的应用中消费Web服务很熟悉了。   这是另外一种视角,与常规充当服务提供者不同,数据库充当的是服务消费者。

以下就是通过数据库存储过程调用Web服务的办法。   Web服务概览   Web服务,从广义而言,就是在两个应用或电子设备之间通过万维网通信的方法。Web……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

“我需要用多个供应商的存货信息来更新本地存货数据库。供应商提供的是基于Web服务的接口。由于应用没有任何服务器端的组件(应用是一个胖客户端,直接与数据库对话),有没有可能直接通过我的应用数据库直接使用这些Web服务?”

  你是不是也受到类似问题的困扰?有没有想过此类问题的解决方案应该是怎样的?到目前为止,我们已经对从各种数据库获取数据的应用中消费Web服务很熟悉了。

REST vs. SOAP:如何挑选最好的Web服务

  这是另外一种视角,与常规充当服务提供者不同,数据库充当的是服务消费者。以下就是通过数据库存储过程调用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还会有更多的选项和功能,因此数据库可以同时充当(服务)消费者和提供者。充分发挥这种办法的优势最终将会令数据库范式和操作全球化。

翻译

boxi
boxi

相关推荐