码迷,mamicode.com
首页 > 其他好文 > 详细

也来讲REST、SOAP

时间:2018-08-24 02:13:26      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:风格   解码   之间   png   远程   改变   接口   开始   service   

 

在GIS网络开发过程中不可避免的的会涉及到REST(Representational State Transfer)的服务。自从Roy Fielding博士在2000年他的博士论文中提出REST风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。HTTP设计本身以及URI成熟的重写与缓存机制使得RESTful HTTP成为一种不错的架构选择,该架构具有很好的松耦合性和可伸缩性。

Web API

如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。例如,我们想要获取某个电商网站的某个商品,输入http://localhost:3000/products/123,就可以看到id为123的商品页面,但这个结果是HTML页面,它同时混合包含了Product的数据和Product的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从HTML中解析出Product的数据。读取http://localhost:3000/api/products/123,如果能直接返回Product的数据,那么机器就可以直接读取。

REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。

由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。

如果我们把前端页面看作是一种用于展示的客户端,那么API就是为客户端提供数据、操作数据的接口。这种设计可以获得极高的扩展性。例如,当用户需要在手机上购买商品时,只需要开发针对iOS和Android的两个客户端,通过客户端访问API,就可以完成通过浏览器页面提供的功能,而后端代码基本无需改动。

 

REST service是一种架构模式,近几年比较流行了,它的轻量级web服务,发挥HTTP协议的原生的GET,PUT,POST,DELETE。

虽然乍一看这些方法将会转化成CRUD操作,但是事实却并非如此。通常,我们所创建的资源并不表示任何持久化实体,而是封装了某种行为,当我们将HTTP动词应用在这些资源上时,我们实际上是在调用这些行为。在HTTP规范中,每种HTTP方法都有一个明确的定义。比如,GET方法只能用于“安全”的操作:(1)它不修改数据;(2)它总是读取数据;(3)它读取到的数据可能被缓存起来。SOAP风格Web服务的主要推动者之一Don Box曾经说,HTTP的GET方法是分布式系统中最优化的方法。由此可知,Web之所以具有这么好的性能和可伸缩性,恰恰是得益于这种常见的HTTP GET方法。  有些HTTP方法是幂等(意味着对同一URL的多个请求应该返回同样的结果)的,即我们可以安全地对失败的请求进行重试。这些方法包括GET、PUT和DELETE等。

REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。REST 并非始终是正确的选择。 它作为一种设计 Web 服务的方法而变得流行,这种方法对专有中间件(例如某个应用程序服务器)的依赖比基于 SOAP 和 WSDL 的方法更少。 在某种意义上,通过强调URI和HTTP等早期 Internet 标准,REST 是对大型应用程序服务器时代之前的 Web 方式的回归。 如下图示例:

技术分享图片

 

使用REST的关键是如何抽象资源,抽象得越精确,对REST的应用就越好。

REST服务关键原则:

1. 给一切物体一个ID

2.连接物体在一起

3.使用标准方法

4.资源多重表述

5.无状态通信

假设我们有这样的类OrderManagementService, CustomerManagementService:

技术分享图片

   技术分享图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实现REST将是基于HTTP应用协议,像上右图那样。

上图实现了对订单,客户之间的相关CRUD操作,我们看到使用对应的HTTP协议。

REST能实现是一种解耦方法,让我们实现这些架构特性:性能,伸缩性,简化,可修改性,扩展性

在J2EE中我们可以使用JAX-RS, Dropwizard…
dotnet平台可以使用Web API, WCF,servicestack,nancyfx。

SOAP

SOAP (Simple Object Access Protocol) 顾名思义,是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据。事实上SOAP数据使用XML数据格式,定义了一整套复杂的标签,以描述调用的远程过程、参数、返回值和出错信息等等。而且随着需要的增长,又不得增加协议以支持安全性,这使SOAP变得异常庞大,背离了简单的初衷。另一方面,各个服务器都可以基于这个协议推出自己的API,即使它们提供的服务及其相似,定义的API也不尽相同,这又导致了WSDL的诞生。WSDL (Web Service Description Language) 也遵循XML格式,用来描述哪个服务器提供什么服务,怎样找到它,以及该服务使用怎样的接口规范,简言之,服务发现。现在,使用Web Service的过程变成,获得该服务的WSDL描述,根据WSDL构造一条格式化的SOAP请求发送给服务器,然后接收一条同样SOAP格式的应答,最后根据先前的WSDL解码数据。绝大多数情况下,请求和应答使用HTTP协议传输,那么发送请求就使用HTTP的POST方法。

 

REST和SOAP的区别

因为SOAP并不假定传输数据的下层协议,因此必须设计为能在各种协议上运行。即使绝大多数SOAP是运行在HTTP上,使用URI标识服务,SOAP也仅仅使用POST方法发送请求,用一个唯一的URI标识服务的入口。举一个图书馆在线查询管理系统为例,服务提供者必须为每一本书提供一个内部标识,然后可能定义一个listBooks操作来返回一系列图书,一个getBook操作来返回指定的图书,一个createBook操作来向数据库加入新增的图书,一个deleteBook操作来删除作废的图书,每个操作都有各自的参数,尤其是用内部标识来标识操作的图书。这种设计被诟病之处,在于deleteBook操作也要用POST方法来发送,而其实HTTP协议有更和逻辑的DELETE方法可用。REST正是这样设计的,REST为每一个资源(此处是图书)指定一个唯一的URI,而用HTTP的4种方法GET、POST、PUT、DELETE直观地表示获取、创建、更新和删除图书。同时图书集合也是和单本的图书不同的资源,如果用/books来代表图书列表,/books/ID来代表标识为ID的图书,那么对/books的GET操作就代表返回整个图书列表,对/books/ID的DELETE操作代表删除指定的图书,等等。

 

REST的局限

但是REST就是万能的吗?无状态带来了巨大的优势,同时也带来了难以解决的问题,例如,怎样授权特定用户才能使用的服务?怎样验证用户身份?如果坚持服务器无状态,也就是不记录用户登录状态,势必要求每一次服务请求都包含完整的用户身份和验证信息。在这种情况下,怎样避免冒认?怎样避免用户信息泄漏?事实上,构建REST附属的安全机制已经在讨论中,其结果无非导致另一个SOAP:复杂的需求摧残了易用性。
REST的支持者声称REST的请求和应答数据简单可读,而SOAP则需要一系列繁琐的封装;即使如此,SOAP仍然不能达到接口的一致性,不同的厂商有各自的接口,而REST只使用HTTP定义的方法,因此是通用的。事实确实如此吗?试想用REST实现两数求和的服务,如果按照建议的做法,把服务(此处是加法)作为一个资源,参数(此处是两个加数)作为请求的参数,结果以XML或JSON语法返回,是否比SOAP更简单易用?通用接口仍然没法达到,因为资源的名称、参数的名称、结果的格式仍然是服务提供者定义的。为了解决这个问题,提出了WASL(Web Application Description Language)来描述REST接口。WADL就像是WSDL的REST版,随着REST被应用到复杂的领域,SOAP的影子无处不在。


面向资源和面向事务
REST在面向资源的应用中左右逢源,但在面向事务的应用中却未如人意。面向资源的应用操作简单,无非创建、读取、改变、删除几项,但是面向事务的应用不允许用户直接操作资源,用户只需向系统提交一个事务说明要求,然后等待事务的完成,就如一个网上银行的用户不直接修改账户和存款,而是提交一个事务告诉银行自己要转账。如果把这样的服务看成一种资源,通过向资源发送POST请求完成事务,那不过是SOAP的翻版而已,无论是这样,还是通过PUT来创建事务,都改变了系统的状态(资源本身未改变,此处是改变了用户的余额),显然违背了REST直观的初衷。

事实上,一些Web Service提供者提供的REST API只有REST的外壳,传输的请求和应答全然是简化了的SOAP,这种新瓶装旧酒的做法只是加深了标准的分歧而已。归根结底REST无法简单地解决一些应用,因此我们只能看到SOAP在REST外壳下的借尸还魂。没有一项技术能一劳永逸地解决所有问题,只需要在预定的约束下优美地解决所在领域的问题就足够了。一项新技术推出的时候总是引来无数的跟风和吹捧,只有当尘埃落定之后才能得到中肯的评价。

 

 

 

 

参考文章

PetterLiuREST服务介绍

廖雪峰,REST

菜鸟吊思REST

MissQingREST和SOAP区别

 

也来讲REST、SOAP

标签:风格   解码   之间   png   远程   改变   接口   开始   service   

原文地址:https://www.cnblogs.com/arxive/p/9527519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!