之前一直想写些RESTful相关的文章,却一直未付诸行动。直到最近接手一个新的项目,对这块重新温习,乘此机会写些相关帖子。欢迎大家评论留言,如有错漏之处,也望各位大佬不令赐教。

话不多说,干活顶上。


SOAP(Simple Object Access Protocol - 简单对象访问协议)定义了一种强类型的消息传递框架,该框架高度依赖XML和schemas。
REST(Representation State Transfer - 表示状态转移)是一种架构样式风格,它利用了当下被广泛采用的技术(特别是HTTP),本身却不创建任何新的标准。REST可以将数据结构序列化为XML,YAML或任何其他机器可读格式,但通常首选JSON。
 
SOAP和REST都支持构建基于应用程序的SOA(Service-oriented architecture,面向服务的架构),在实际项目中如何选择主要看业务的需求是什么。那如何选择呢?
这便是今天的重点,讨论下两者的主要区别。今天主要从一下几个方面进行区别:
 
底层协议
  • SOAP本身便是基于HTTP而发展的协议。
  • REST与HTTP几乎一样,REST规范没有强制的要求。
数据格式
  • SOAP只依靠XML来提供消息传递服务。在某些情况下,消息传递服务可能变得极其复杂。例如,通过javascript访问Web服务,
  • REST可以语言自由的选择易解析的数据格式。例如,CSV、JSON、XML、YAML等等。
有状态
  • SOAP Web服务是无状态的,但是可以通过修改服务器上的代码轻松变为有状态的。
  • RESTful Web服务是完全无状态的。对话状态的管理完全由客户端进行控制。服务端不保留任何状态信息。也就是我们通常所说的,客户端的每次请求必须携带所有可能用到的信息。

HTTP的方法使用

  • SOAP可以对HTTP协议进行绑定。当绑定HTTP协议时,所有的SOAP请求都通过HTTP POST发送。
  • REST主要使用HTTP协议。通过HTTP GET、POST、PUT、DELETE和PATCH方法进行CRUD操作。
缓存
  • SOAP可以使用HTTP传输机制,但是都转换为HTTP POST方法。而POST是非幂等的,所以无法在HTTP级别进行缓存。因此SOAP的响应需要通过 Response Caching Optimization Module给的信息进行缓存。
  • REST可以发送HTTP GET请求,GET是幂等的,因此REST可以使用HTTP提供的缓存机制,使响应数据可以标记为可缓存或不可缓存。
安全
  • SOAP通过WS-SECURITY对安全进行了很好的标准化。
  • REST主要使用HTTP协议,HTTP本身是非常不安全的,但通过TLS它可以支持基础的身份认证和通信加密,即HTTPS。此外,在服务器上还可以进一步实施安全措施。
异步处理

创建和更新通常非常消耗资源,有时会需要异步请求处理。

  • SOAP 1.2提供了额外的标准,可保证应用的可靠性和安全性。例如:WSRM – WS-Reliable Messaging
  • REST我们通常返回HTTP状态码202(Accepted)和队列位置,该位置上,任务的完成状态将会被定期更新(当然,我们也可以将完成状态信息存在数据库中,并定期新增状态信息,供客户端查询)。
总结
总体而言,REST更易于开发,因为它利用了已经存在的Web,并且自由度受到限制(做出的选择更少,因此更简单)。SOAP提供了多种选择,并且开发难度也稍大一些,但是提供了更多的选择。


作者:吴家二少

博客地址:https://www.cnblogs.com/cloudman-open/

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

 

SOAP与REST API的爱恨情仇的更多相关文章

  1. Menu与ActionBar的爱恨情仇

    最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...

  2. 注解:大话AOP与Android的爱恨情仇

    转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...

  3. web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决

    [问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...

  4. 除了love和hate,还能怎么表达那些年的“爱恨情仇”?

    实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...

  5. 对json的爱恨情仇

    本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...

  6. String、StringBuilder、StringBuffer的爱恨情仇

    第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...

  7. [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!

    探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...

  8. Tidyverse|数据列的分分合合,爱恨情仇

    Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...

  9. pytorch和tensorflow的爱恨情仇之基本数据类型

    自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...

随机推荐

  1. iptables匹配端口范围,映射,网络状态

    ####匹配端口范围:iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT <==次选iptables -I I ...

  2. Docker Swarm Mode简介与核心概念

    什么是Docker Swarm Docker Swarm是Docker官方的一种容器编排方案,用于管理跨主机的Docker容器,可以快速对指定服务进行水平扩展.部署.删除 一个Docker Swarm ...

  3. 大数据学习之路-hdfs

    1.什么是hadoop hadoop中有3个核心组件: 分布式文件系统:HDFS —— 实现将文件分布式存储在很多的服务器上 分布式运算编程框架:MAPREDUCE —— 实现在很多机器上分布式并行运 ...

  4. 01_垂直居中body中的应用

    1: 应用场景 在body中书写一个代码块, 使其相对于body垂直居中 <!DOCTYPE html> <html lang="en"> <head ...

  5. java序列化(二)

    上一篇我们简单的了解了java的序列化方法.可以想一下,如果有两个类,如果父类实现了序列化,子类没有实现序列化,子类在进行对象序列化读写时,父类和子类均被实现序列化.如果其中父类没有实现序列化,子类实 ...

  6. Could not find a version that satisfies the requirement numpy>=1.7.0 (from pan das==0.17.0) (from versions: ) No matching distribution found for numpy>=1.7.0 (from pandas==0.17.0)

    今天晚上一直在安装pandas,天杀的,真的是太难了.后来发现提示: Could not find a version that satisfies the requirement numpy> ...

  7. asp.net core 3.x 模块化开发之HostingStartup

    我们希望将一个项目(dll)看做一个模块/插件,一个模块往往需要在应用启动时做一些初始化工作,比如向IOC容器添加一些服务,为应用配置对象添加自己的数据源:也希望在应用关闭时做一些收尾工作,asp.n ...

  8. 【Java基础总结】GUI

    GUI(Graphical User Interface),图形用户接口 CLI(Command Line User Interface),命令行用户接口 1. 容器 Container GUI主要位 ...

  9. 【转】Java面试题:多继承

    招聘和面试对开发经理来说是一个无尽头的工作,虽然有时你可以从HR这边获得一些帮助,但是最后还是得由你来拍板,或者就像另一篇文章“Java 面试题:写一个字符串的反转”所说: 面试开发人员不仅辛苦而且乏 ...

  10. Android反编译三件套 apktool 、dex2jar、jd-gui

    1.还是老话下载三件套(点击下载) 或者自己在百度搜索下载 2.使用apktool反编译apk cd到D:\TESTCODE\android\android反编译三件套目录下 输入java -jar ...