SOAP webserivce 和 RESTful webservice 对比及区别

简单对象访问协议(Simple Object Access Protocol,SOAP)

是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括HTTP、SMTP、MIME,基于“通用”传输协议是 SOAP的一个优点。它还支持从消息系统到远程过程调用(Remote Procedure Call,RPC)等大量的应用程序。SOAP提供了一系列的标准,如WSRM(WS-Reliable Messaging)形式化契约确保可靠性与安全性,确保异步处理与调用;WS-Security、WS-Transactions和WS-Coordination等标准提供了上下文信息与对话状态管理。

表述性状态转移(Representational State Transfer,REST)

相对而言,SOAP协议属于复杂的、重量级的协议。而REST是一种轻量级的Web Service架构风格,其实现和操作比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST架构尤其适用于完全无状态的CRUD(Create、Read、Update、Delete,创建、读取、更新、删除)操作。

HTTP 的 GET、HEAD 请求本质上不会造成服务器端状态的改变。对于服务器来说,客户端对某一 URI 做 n 次的 GET、HAED 调用,其状态与没有做调用是一样的,不会发生任何的变化。 HTTP 的 PUT、DELTE 调用,具有幂指相等特性, 即:客户端对某一 URI 做 n 次的 PUT、DELTE 调用,其效果与做一次的调用是一样的。HTTP 这些标准方法在原则上保证分布式系统具有这些特性,以帮助构建更加健壮的分布式系统。


对比SOAP和REST:

安全控制方面
  • 场景:
    有两个客户端Client1和Client2,对于客户端 Client2,我们只希望它能以只读的方式访问 User 和 User List 资源,而 Client1 具有访问所有资源的所有权限。
  • 通用解决方案:
    通行的做法是:所有从客户端 Client2 发出的 HTTP 请求都经过代理服务器 (Proxy Server)。代理服务器制定安全策略:所有经过该代理的访问 User 和 User List 资源的请求只具有读取权限,即:允许 GET/HEAD 操作,而像具有写权限的 PUT/DELTE 是不被允许的。
  • 对于 REST,安全策略部署方式,如下图所示:

    图1. REST 与代理服务器 (Proxy Servers)


    一般代理服务器的实现根据 (URI, HTTP Method) 两元组来决定 HTTP 请求的安全合法性。 当发现类似于(http://localhost:8182/v1/users/{username},DELETE)这样的请求时,予以拒绝。
  • 对于 SOAP,如果想借助于既有的代理服务器进行安全控制,会比较尴尬,如下图:

    图2. SOAP 与代理服务器 (Proxy Servers)


    所有的 SOAP 消息经过代理服务器,只能看到( http://localhost:8182/v1/soap/servlet/messagerouter , HTTP POST)这样的信息,如果代理服务器想知道当前的 HTTP 请求具体做的是什么,必须对 SOAP 的消息体解码,这样的话,意味着要求第三方的代理服务器需要理解当前的 SOAP 消息语义,而这种 SOAP 应用与代理服务器之间的紧耦合关系是不合理的。
    缓存方面
  • 背景
    对于基于网络的分布式应用,网络传输是一个影响应用性能的重要因素。如何使用缓存来节省网络传输带来的开销,这是每一个构建分布式网络应用的开发人员必须考虑的问题。 HTTP 协议带条件的 HTTP GET 请求 (Conditional GET) 被设计用来节省客户端与服务器之间网络传输带来的开销,这也给客户端实现 Cache 机制 ( 包括在客户端与服务器之间的任何代理 ) 提供了可能。HTTP 协议通过 HTTP HEADER 域:If-Modified-Since/Last- Modified,If-None-Match/ETag 实现带条件的 GET 请求。
  • 对于REST
    REST 的应用可以充分地利用 HTTP 协议对缓存支持的能力。当客户端第一次发送 HTTP GET 请求给服务器获得内容后,该内容可能被缓存服务器 (Cache Server) 缓存。当下一次客户端请求同样的资源时,缓存可以直接给出响应,而不需要请求远程的服务器获得。而这一切对客户端来说都是透明的。如图3:

    图3. REST 与缓存服务器 (Cache Server)

  • 对于SOAP
    使用 HTTP 协议的 SOAP,由于其设计原则上并不像 REST 那样强调与 Web 的工作方式相一致,所以,基于 SOAP 应用很难充分发挥 HTTP 本身的缓存能力。如图4:

    图4. SOAP 与缓存服务器 (Cache Server)

  • 两个因素决定了基于 SOAP 应用的缓存机制要远比 REST 复杂:
    其一、所有经过缓存服务器的 SOAP 消息总是 HTTP POST,缓存服务器如果不解码 SOAP 消息体,没法知道该 HTTP 请求是否是想从服务器获得数据。
    其二、SOAP 消息所使用的 URI 总是指向 SOAP 的服务器,这并没有表达真实的资源 URI,其结果是缓存服务器根本不知道那个资源正在被请求,更不用说进行缓存处理。
    连接性
  • SOAP
    在一个纯的 SOAP 应用中,URI 本质上除了用来指示 SOAP 服务器外,本身没有任何意义。与 REST 不同的是,无法通过 URI 驱动 SOAP 方法调用。例如在上面的例子中,当我们通过 getUserList SOAP 消息获得所有的用户列表后,仍然无法通过既有的信息得到某个具体的用户信息。唯一的方法只有通过 WSDL 的指示,通过调用 getUserByName 获得,getUserList 与 getUserByName 是彼此孤立的。
  • REST
    通过 http://localhost:8182/v1/users URI 获得用户列表,然后再通过用户列表中所提供的 LINK 属性,例如 http://localhost:8182/v1/users/tester 获得 tester 用户的用户信息。
    各自优势:
  • REST
    REST构建的系统其系统的扩展能力要强于 SOAP,体现在它的统一接口抽象、代理服务器支持、缓存服务器支持等诸多方面,
  • SOAP
    SOAP的成熟性可以给需要提供给多开发语言的,多传输方式的,对于安全性要求较高的接口设计带来便利。

    概念性区别:

    REST
    是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。
      REST提出设计概念和准则:
        1.网络上的所有事物都可以被抽象为资源(resource)
        2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识
        3.所有的操作都是无状态的
      REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。
      由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。
    SOAP
    偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容。
    强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。
    而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架构风格。
    如何确定使用REST:
    若本身只是简单的CRUD业务操作,那么抽象资源就比较容易。
    而对于复杂的业务活动抽象资源并不是一个简单的事情,比如校验用户等级,转账,事务处理等。
    
    如何确定使用SOAP:
    若有严格的规范和标准定义要求,且前期需要指导多个业务系统集成和开发的时,
    因SOAP风格有清晰的规范标准定义,SOAP更适合。
    我们可以在开始和实现之前就严格定义相关的接口方法和接口传输数据。
    
    总之:
    简单数据操作,无事务处理,开发和调用简单使用REST架构风格较好。
    
    再者:
    REST核心是url和面向资源,url代替了原来复杂的操作方法。
    REST允许我们通过url设计系统,就像测试驱动开发使用测试用例设计类接口一样。
    所有可以被抽象为资源的东西都可以使用RESTful的url。
    
    REST关键:
    使用REST的关键是如何抽象资源,抽象的越精确,对REST的应用越好。
    
    REST思想
    1、面向接口设计
    2、抽象操作为基础的CRUD
    3、http协议是应用协议而非传输协议
    4、无状态、自包含
    SOAP Webservice和RESTful Webservice比较
  1. 成熟度(总的来说SOAP在成熟度上优于REST)
    SOAP对于异构环境服务发布和调用,以及厂商的支持都已经达到了较为成熟的情况。
    REST国外很多大网站都发布了自己的开发API,很多都提供了SOAP和REST两种Web Service,
    但是由于REST只是一种基于Http协议实现资源操作的思想,因此各个网站的REST实现都自有一套。
      REST实现的各种协议仅仅只能算是私有协议,需要遵循REST的思想。
  2. 效率和易用性(REST更胜一筹)
    SOAP协议对于消息体和消息头都有定义,同时消息头的可扩展性为各种互联网的标准提供了扩展的基础,WS-*系列就是较为成功的规范。但是SOAP由于各种需求不断扩充其本身协议的内容,导致在SOAP处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。
    REST被人们的重视,其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了Http最初的应用协议设计理念。REST很好的融合当前Web2.0的很多前端技术来提高开发效率。例如:很多大型网站开放的REST风格的API都会有多种返回形式(XML,JSON,RSS,ATOM)等形式。
  3. 安全性
    SOAP在安全方面使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的,当前已经得到了各个厂商的支持,.net ,php ,java 都已经对其有了很好的支持。
    REST 开放REST风格API的网站主要分成两种:一种是自定义了安全信息封装在消息中,另外一种就是靠硬件SSL来保障,这只能够保证点到点的安全,如果是需要多点传输的话SSL就无能为力了。安全这块其实也是一个很大的问题。