很多人在软件开发中会分不清 SOAP 和 REST 方式,今天就来浅谈一下两者之间的区别。
通俗理解
通俗的来说,互联网时代,通信变得更加简单了,只要有网络就可以实现通信。通信需要遵循的一个规则就是协议。Rest 和 Soap 我们可以理解为信件和明信片,它们是建立在 Http 协议的通信方式。
Soap 是建立在 Http 之下的一种软件程序之间的通讯协议,
信封
Rest 是一种规范,主流的 Web API ,核心就是资源,一个资源可以就是被标识的实体,有具体的名称和地址。
邮票
Soap 主要通过 xml 格式传递消息,而 Rest 可以使用 xml.json.html 。
邮政员
TCP/IP 协议。
SOAP 协议
SOAP(Simple Object Access Protocol 简单对象访问协议),是交换数据的一种协议规范,是一种轻量的、简单的、基于 XML(标准通用标记语言下的一个子集)的协议,它被设计成在 Web 上交换结构化的和固化的信息。

REST 风格
REST(Representational State Transfort) 形式上应该表述为客户端通过申请资源来实现状态的转换,在这个角度系统可以看成一台虚拟的状态机。
REST API 就是把数据以资源的形式暴露出来,并使用标准的 Http 方法来代表创建、读取、更新和删除等
不用的方法表明了要执行的动作,不同的 http 方法作用于同一个 URL 上可实现不同的功能按照REST原则设计的软件、体系结构,通常被称为 “ REST 式的”(RESTful),REST 应该满足这样的特点:
客户端和服务器结构
连接协议具有无状态性
能够利用 Cache 机制增进性能
层次化的系统
按需代码

区别
SOAP Web Services 的开发需要遵循 SOAP 协议。
REST Web services 的开发需要遵循 REST 的架构风格。
一个 REST Web service 也可以使用 SOAP 协议。
SOAP 支持 XML 消息格式,REST 支持平文,HTML,XML,JSON 格式消息
SOAP 是功能驱动, REST 是数据驱动或资源驱动
SOAP 更安全,不仅像 REST 一样支持 SSL ,还增加了企业及安全特性的 WebServices -Security,因此它能提供通过中介的身份验证,而不仅仅是端对端的验证(SSL)。
可以内置的 ACID ,指数据库事务正确执行的四个基本要素的缩写,包含,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
而 REST 受限于 HTTPS,HTTP,本身无法提供两阶段提交分布式十五资源,但 SOAP 可以。
SOAP 的优势
与 REST 相比,SOAP 有以下优势:
独立于语言、平台、传输
在分布式企业环境中运行良好
标准化
提供重要的WebServices
内置错误处理

REST 优势
REST 在大多数情况下更易于使用且更灵活。与 SOAP 相比,它具有以下优势:
无需昂贵的工具即可与 Web 服务交互
学习曲线更小
使用更小的信息格式完成高效信息传递
无需大量处理,更快速传递信息

总结
每个协议都有明确的优点和缺点。选择 SOAP 还是 REST 取决于 使用的编程语言、使用环境要求。
在许多情况下,Web 服务的选择也决定了我们对协议的选择。无论为 Web 服务选择 SOAP 还是 REST,确保能够彻底测试 API 。使用拥有一整套功能、性能、安全性的 API管理工具,可满足 API 更高更全面的测试需求。
这里我推荐图中演示工具 Eolink,它一款能设计、管理 API,一键生成 API 文档的管理工具,除此之外还能直接打通接口测试,一键发起 API 测试,方便快捷且功能强大。感兴趣可自行使用:www.eolink.com
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性
Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko
我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
在Ruby中,我试图理解to_enum和enum_for方法。在我提出问题之前,我提供了一些示例代码和两个示例来帮助理解上下文。示例代码:#replicatesgroup_bymethodonArrayclassclassArraydefgroup_by2(&input_block)returnself.enum_for(:group_by2)unlessblock_given?hash=Hash.new{|h,k|h[k]=[]}self.each{|e|hash[input_block.call(e)]示例#1:irb(main)>puts[1,2,3].group_by2.ins